簡體   English   中英

MySQL在基於性別和生日的選擇情況下顯示空值

[英]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的作用是:

  1. 從子查詢的社會表中獲取所有行
  2. 使用子查詢的結果執行主查詢

第三 ,最后但並非最不重要。 如果您確實必須在MySQL中執行此操作,那么這將是一個可行的方法。 創建一個包含所有年齡組的表(也可以是臨時表),然后以正確的方式進行聯接(在我的示例中為RIGHT聯接,但我認為也可以扭轉查詢的位置並進行LEFT聯接,您只能使用INNER JOIN,因為這樣會否定最終結果集中的行在聯接的一側為NULL的可能性,因此您也將獲得NULL結果。 我根據您的方法在sqlfiddle上創建了一個簡單的示例 但是請注意,這只是一個快速而骯臟的解決方案(例如,我通過將age_to設置為1000欺騙了最大日期范圍)。

附帶說明:我不建議將天數除以365來計算年齡。請記住,存在leap年,因此隨着時間的推移,您的結果將越來越不准確。 最簡單(也是最可靠的方法)是imho從當年減去出生年份,並檢查日期是否已經過今年,以便從結果中減去1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM