2011-01-10 26 views
6

私は基本的にユーザーとその対応する生年月日を持つmysqlデータベースを持っています。私はまた、ユーザーの実際の年齢を生年月日から見つけるのに役立つ次のコードを見つけました。 Finding date of birth私がする必要があるのは、異なる「年齢層」を見つけて、その年齢層のユーザーの数を数えることです。私はまた、このデータをグループ化する方法を正確に示しているの例を見つけました。私は年齢を最初に計算して、次のような方法でそれを使用したいと思っています。link私は次のコードを書いており、実行中にエラーが発生しています:mysqlで年齢層別にユーザー数をグループ化する方法

SELECT DATE_FORMAT(NOW(), '%Y') - 
DATE_FORMAT(data_of_birth, '%Y') - 
(DATE_FORMAT(NOW(), '00-%m-%d') < 
DATE_FORMAT(data_of_birth, 
'00-%m-%d')) AS age, COUNT(*), 
CASE 
    WHEN age >= 10 AND age <= 20 THEN '10-20' 
    WHEN age >=21 AND age <=30 THEN '21-30' 
    WHEN age >=31 AND age <=40 THEN '31-40' 
    WHEN age >=41 AND age <= 50 THEN '31-40' 
    WHEN age >=51 AND age <=60 THEN '51-60' 
    WHEN age >=61 THEN '61+' 
END AS ageband 
.. .. 
GROUP BY ageband 

フィールドの年齢がわからないというエラーが表示されます。私はこれを間違って書いていますか? case文に年齢が記述されている年齢を計算するコードブロック全体を簡単に書くことができますが、これは非常に非効率的です。私はまだmysqlをよく使っていませんが、これを行うにはもっと良い方法があるはずです。私の主な質問は、クエリ内で関数を作成し、その関数の出力を値に割り当てる何らかの方法があるかどうかということですね。あなたはサブクエリを使用することができます。この場合

+0

あなたは、年齢を取得するための珍しいコードがたくさんあります。 YEAR(CURDATE()) - YEAR(date_of_birth)AS年齢 – dqhendricks

+0

誰もが1月1日に生まれた場合、それはいつもうまくいくでしょう... – ODaniel

答えて

14

SELECT 
    COUNT(*), 
    CASE 
    WHEN age >=10 AND age <=20 THEN '10-20' 
    WHEN age >=21 AND age <=30 THEN '21-30' 
    WHEN age >=31 AND age <=40 THEN '31-40' 
    WHEN age >=41 AND age <=50 THEN '41-50' 
    WHEN age >=51 AND age <=60 THEN '51-60' 
    WHEN age >=61 THEN '61+' 
    END AS ageband 
FROM 
    (
    DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS age, 
.. .. 
) as tbl 
GROUP BY ageband; 

だから、最初、それは年齢値を集約するよりも、サブクエリを実行し、年齢のテーブルを作成します。

+0

これは素晴らしいです! –

関連する問題