[英]MySQL display null value in select case based on gender and birthdate
我有基於出生和性別的CASE條件的SQL語法。 以下是我使用的示例查詢
SELECT Age, SUM(gender = 'M') M, SUM(gender = 'F') F, COUNT(*) TotalPerson FROM (SELECT CASE WHEN FLOOR(DATEDIFF(CURDATE(), birdth) / 365) 60 THEN '60 Above' END Age, gender FROM society) ageList GROUP BY Age
結果變成這樣:
Age | M | F | TotalPerson -------------------------------- 19 - 25 | 1 | 0 | 1 19 - 25 | 1 | 0 | 1 26 - 45 | 1 | 2 | 3 46 - 60 | 0 | 1 | 1 60 Above | 0 | 2 | 2
對於完整的語法,這是我的sqlfiddle: http://sqlfiddle.com/#!9/e8c12a/2
但我真正需要的結果是同時顯示具有空值的年齡。
像這樣的例子:
Age | M | F | TotalPerson -------------------------------- 0 - 5 | 0 | 0 | 0 6 - 10 | 0 | 0 | 0 11 - 18 | 0 | 0 | 0 19 - 25 | 1 | 0 | 1 19 - 25 | 1 | 0 | 1 26 - 45 | 1 | 2 | 3 46 - 60 | 0 | 1 | 1 60 Above | 0 | 2 | 2
您可以與社會同齡:
SELECT
Age,
COALESCE(SUM(gender = 'M'), 0) M,
COALESCE(SUM(gender = 'F'), 0) F,
COALESCE(SUM(gender = 'M'), 0) + COALESCE(SUM(gender = 'F'), 0) TotalPerson
FROM
(
SELECT '0 - 5' AS Age, 0 AS age1, 6 AS age2 UNION
SELECT '6 - 10', 6, 10 UNION
SELECT '11 - 18', 11, 18 UNION
SELECT '19 - 25', 19, 25 UNION
SELECT '26 - 45', 26, 45 UNION
SELECT '46 - 60', 46, 60 UNION
SELECT '60 Above', 60, 1000
) ages
LEFT JOIN society ON FLOOR(DATEDIFF(CURDATE(), birdth) / 365) BETWEEN age1 AND age2
GROUP BY Age
ORDER BY age1
SQL小提琴示例
這里有幾件事情要考慮。
首先 ,如果必須使用SQL進行操作,則應該認真思考。 恕我直言,查詢只應負責從數據庫中獲取數據,而不是(如果您這樣做的話)負責GUI中所有年齡段的顯示或類似操作。
其次 ,您的方法不起作用的原因是查詢的處理方式。 用我自己的話來簡化,MySQL的作用是:
第三 ,最后但並非最不重要。 如果您確實必須在MySQL中執行此操作,那么這將是一個可行的方法。 創建一個包含所有年齡組的表(也可以是臨時表),然后以正確的方式進行聯接(在我的示例中為RIGHT聯接,但我認為也可以扭轉查詢的位置並進行LEFT聯接,您只能使用INNER JOIN,因為這樣會否定最終結果集中的行在聯接的一側為NULL的可能性,因此您也將獲得NULL結果。 我根據您的方法在sqlfiddle上創建了一個簡單的示例 。 但是請注意,這只是一個快速而骯臟的解決方案(例如,我通過將age_to設置為1000欺騙了最大日期范圍)。
附帶說明:我不建議將天數除以365來計算年齡。請記住,存在leap年,因此隨着時間的推移,您的結果將越來越不准確。 最簡單(也是最可靠的方法)是imho從當年減去出生年份,並檢查日期是否已經過今年,以便從結果中減去1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.