2012-02-21 13 views
2

希望あなたは私を助けることができます!年齢グループ間のSQL

country | Date_of_birth 
----------------------- 
france | 1980-07-01 
spain | 1978-03-23 
greece | 1981-05-05 
germany | 1974-08-11 

私はこの結果を取得しようとしている:

私は次のデータベースを持っている

country | 13 - 17 | 25 - 45 | 65 - 75 
------------------------------------- 
france |   |  1 | 
spain |   |  1 | 
greece |   |  1 | 

クエリが、私はここまで考え出し:

SELECT SUM(IF(age BETWEEN 13 AND 17 , 1, 0)) AS '13 - 17', 
     SUM(IF(age BETWEEN 25 AND 45 , 1, 0)) AS '25 - 45', 
     SUM(IF(age BETWEEN 65 AND 75 , 1, 0)) AS '65 - 75' 
FROM (SELECT TIMESTAMPDIFF(YEAR, Date_of_birth, CURDATE()) AS age, country FROM data 
) AS test 
GROUP BY country 
HAVING country IN ("france","greece,"spain") 

結果:

13 - 17 | 25 - 45 | 65 - 75 
---------------------------- 
     |  1 | 
     |  1 | 
     |  1 | 

どのように私は最初に "国"の列を取得するか考えていますか?

ありがとうございます!

答えて

2

Havingは、集約カラムでのみ機能します。あなたは、単純なwhereをしたい:

SELECT 
     country, 
     SUM(age BETWEEN 13 AND 17) AS '13 - 17', 
     SUM(age BETWEEN 25 AND 45) AS '25 - 45', 
     SUM(age BETWEEN 65 AND 75) AS '65 - 75' 
FROM (SELECT TIMESTAMPDIFF(YEAR, Date_of_birth, CURDATE()) AS age, country FROM data 
    ) AS test 
WHERE country IN ('france', 'greece', 'spain') 
GROUP BY country 

注意は、クエリの簡素化:mysqlのtrueでは1あるとfalse0あるので、あなたは、単に条件を合計することができます - あなたはcaseは必要ありません。

また、構文エラーがありました。あなたの国の値を一重引用符で囲む必要がありました。

+0

+1私はきちんと 'sum'好き - 恐ろしい –

1

あなたは「国」の列が含まれたい場合は、SELECT部分​​でそれを追加する必要があります。

SELECT 
    country, 
    SUM(IF(age BETWEEN 13 AND 17 , 1, 0)) AS '13 - 17', 
    SUM(IF(age BETWEEN 25 AND 45 , 1, 0)) AS '25 - 45', 
    SUM(IF(age BETWEEN 65 AND 75 , 1, 0)) AS '65 - 75' 
FROM (SELECT TIMESTAMPDIFF(YEAR, Date_of_birth, CURDATE()) AS age, country FROM data 
) AS test 
GROUP BY country 
HAVING country IN ("france","greece,"spain") 
0
SELECT country, SUM...., SUM..., SUM... 
+0

非常にクールをしてくれてありがとうあなたの迅速な対応!集約された列について読んで、コンセプトを理解する必要があります! ;) – user1224364

+0

ほとんどの場合、 "DATA"テーブルにDATAテーブルを追加する必要があります。 – alfasin