2012-02-21 58 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中true1false0,所以你可以簡單地總結了條件 - 你不需要case

此外,你有一個語法錯誤 - 你需要單引號圍繞你的國家的價值。

+0

+1我喜歡整潔的'sum' - 非常酷 – 2012-02-21 21:36:49

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 2012-02-21 21:53:00

+0

幾乎你需要將表DATA添加到「FROM」 – alfasin 2012-02-22 00:44:07