2013-06-27 9 views
0

作爲我從我的問題得到的答案,它促使我堅持應用我的代碼出於某種原因,爲什麼它沒有奏效。Mysql與CASE選擇不檢索其他列值?

這是我在桌上的一部分數據。

enter image description here

原始代碼:

SELECT AGE_RANGE, COUNT(*) FROM (
    SELECT CASE 
     WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5' 
     WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10' 
     WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15' 
     WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20' 
     WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30' 
     WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40' 
     WHEN YearsOld > 40 THEN '40+' 
     END AS 'AGE_RANGE' 
     FROM (
      SELECT YEAR(CURDATE())-YEAR(DATE(birthdate)) 'YearsOld' 
      FROM MyTable 
     ) B 
) A 
GROUP BY AGE_RANGE 

,這裏是結果。

enter image description here

我想要做的是,我想補充另一列這將有多少人指望誰是在這方面這將是位置,你會看到在其中包括珀斯,西澳大利亞州,森伯裏,維多利亞等。

首先試圖解決我的問題

正如你會看到下面,我已經添加了位置,和COUNT(位置)上文獲得位置的名稱和多少的位置,是重複計數在桌子裏。

SELECT AGE_RANGE, COUNT(*), location, COUNT(location) loc FROM (
    SELECT CASE 
     WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5' 
     WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10' 
     WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15' 
     WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20' 
     WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30' 
     WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40' 
     WHEN YearsOld > 40 THEN '40+' 
     END AS 'AGE_RANGE', 'location' 
     FROM (
      SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld' 
      FROM event_participants 
     ) B 
) A 
FROM event_participants WHERE location <> '' GROUP BY location HAVING loc >= 1 ORDER BY loc DESC LIMIT 5 

哪些結果..

enter image description here

顯然,從神的幫助聽力不工作了,以好..

我的第二次嘗試來解決這個問題

SELECT AGE_RANGE, COUNT(*), location FROM (
    SELECT CASE 
     WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5' 
     WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10' 
     WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15' 
     WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20' 
     WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30' 
     WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40' 
     WHEN YearsOld > 40 THEN '40+' 
     END AS 'AGE_RANGE', 'location' 
     FROM (
      SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld' 
      FROM event_participants 
     ) B 
) A 
GROUP BY AGE_RANGE 

和結果是...

enter image description here

而不是顯示國家的名字,只顯示位置。

好吧..

長話短說,代碼有什麼問題?任何解決這個東西?

這就像,我需要的結果是,

AGE_RANGE COUNT(*) location   total number of same location 

16-20  4  Name of location     # 

21-30  45  Name of location     # 

31-40  79  Name of location     # 

40+  102  Name of location     # 
+0

請使用SQL小提琴:) –

+0

如果'location'是一個列,請不要用單引號,'AS'AGE_RANGE',位置'來包裝它。<<刪除它並查看它是否有效。 –

回答

1

這應該工作:想想每個子查詢的,因爲它是自己的表,所以你只需要確保選擇您需要的所有列。 (CASE WHEN THEN END AS)實際上只是一個列值。您可能還想在地點上進行分組,以便在不同地點獲得相同的年齡段。 (例。11-15在加拿大和美國11-15)

SELECT AGE_RANGE, COUNT(*), A.location FROM (
     SELECT CASE 
      WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5' 
      WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10' 
      WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15' 
      WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20' 
      WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30' 
      WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40' 
      WHEN YearsOld > 40 THEN '40+' 
      END AS 'AGE_RANGE', B.location 
      FROM (
       SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld', 
       location /* << just missing this select */ 
       FROM event_participants 
      ) B 
    ) A 
    GROUP BY A.location, AGE_RANGE 
+0

嗯,我不知道怎麼說這個,但是,我在發佈這個問題之前就已經對我過去的嘗試做了什麼,在這裏調試,直到我瘋了足以再次發佈。那麼,出於某種原因,位置COLUMN的價值是「位置」而不是國家的名稱。 最上面的圖片上的前三列名稱是「性別」「生日」「位置」 它與代碼上的位置列匹配,但它只顯示結果'位置'。 –

+0

稍微修改了代碼,您可能需要在A子查詢中使用B.location而不是'location'。另外請確保您將位置列添加到B子查詢的選擇中。 –

+0

哦!有效!儘管如此,我期望的結果卻是不同的。儘管如此,我得到了我需要的所有要求,能夠顯示具有相應年齡的所有值,現在我可以自己管理這些值。再次感謝您再次幫助我! :) –

0

這是不正確的: -

SELECT AGE_RANGE, COUNT(*), location FROM 

當您使用GROUP BY在選擇屬性列表必須是適用於聚合函數必須成爲GROUP BY條款的一部分。

在下面你的例子不能顯示位置,因爲人在age-group的名稱可能屬於不同的位置: -

AGE_RANGE COUNT(*) location   total number of same location 

16-20  4  Name of location     # 

21-30  45  Name of location     # 
1

試試這個

SELECT AGE_RANGE, COUNT(*), location FROM (
     SELECT CASE 
      WHEN YearsOld BETWEEN 0 AND 5 THEN '0-5' 
      WHEN YearsOld BETWEEN 6 AND 10 THEN '6-10' 
      WHEN YearsOld BETWEEN 11 AND 15 THEN '11-15' 
      WHEN YearsOld BETWEEN 16 AND 20 THEN '16-20' 
      WHEN YearsOld BETWEEN 21 AND 30 THEN '21-30' 
      WHEN YearsOld BETWEEN 31 AND 40 THEN '31-40' 
      WHEN YearsOld > 40 THEN '40+' 
      END AS 'AGE_RANGE', 'location' 
      FROM (
       SELECT YEAR(CURDATE())-YEAR(DATE(birthday)) 'YearsOld' 
       FROM event_participants 
      ) B 
    ) A 
    GROUP BY location, AGE_RANGE