首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 多維度年齡段與性別統計查詢:CASE WHEN 進階應用

     編輯:MySQL 綜合教學

業務場景

體檢系統需按性別(男/女)與年齡段(18-29, 30-39... 80+)統計人數,單次查詢輸出所有維度指標。

核心 SQL 實現

SELECT 
  COUNT(tr.id) AS '體檢總人數',
  SUM(CASE WHEN s.sex = 1 THEN 1 ELSE 0 END) AS '男體檢總數',
  SUM(CASE WHEN s.sex = 0 THEN 1 ELSE 0 END) AS '女體檢總數',
  -- 男 18-29 歲
  SUM(CASE WHEN s.sex = 1 AND tr.age >= 18 AND tr.age <= 29 THEN 1 ELSE 0 END) AS '男18-29歲',
  -- 女 18-29 歲
  SUM(CASE WHEN s.sex = 0 AND tr.age >= 18 AND tr.age <= 29 THEN 1 ELSE 0 END) AS '女18-29歲',
  -- 男 30-39 歲 (註:原碼 <=45 疑為筆誤,建議 <=39)
  SUM(CASE WHEN s.sex = 1 AND tr.age >= 30 AND tr.age <= 39 THEN 1 ELSE 0 END) AS '男30-39歲',
  SUM(CASE WHEN s.sex = 0 AND tr.age >= 30 AND tr.age <= 39 THEN 1 ELSE 0 END) AS '女30-39歲',
  -- 男 40-49 歲
  SUM(CASE WHEN s.sex = 1 AND tr.age >= 40 AND tr.age <= 49 THEN 1 ELSE 0 END) AS '男40-49歲',
  SUM(CASE WHEN s.sex = 0 AND tr.age >= 40 AND tr.age <= 49 THEN 1 ELSE 0 END) AS '女40-49歲',
  -- 男 50-59 歲
  SUM(CASE WHEN s.sex = 1 AND tr.age >= 50 AND tr.age <= 59 THEN 1 ELSE 0 END) AS '男50-59歲',
  SUM(CASE WHEN s.sex = 0 AND tr.age >= 50 AND tr.age <= 59 THEN 1 ELSE 0 END) AS '女50-59歲',
  -- 男 60-69 歲
  SUM(CASE WHEN s.sex = 1 AND tr.age >= 60 AND tr.age <= 69 THEN 1 ELSE 0 END) AS '男60-69歲',
  SUM(CASE WHEN s.sex = 0 AND tr.age >= 60 AND tr.age <= 69 THEN 1 ELSE 0 END) AS '女60-69歲',
  -- 男 70-79 歲
  SUM(CASE WHEN s.sex = 1 AND tr.age >= 70 AND tr.age <= 79 THEN 1 ELSE 0 END) AS '男70-79歲',
  SUM(CASE WHEN s.sex = 0 AND tr.age >= 70 AND tr.age <= 79 THEN 1 ELSE 0 END) AS '女70-79歲',
  -- 男 80 歲以上
  SUM(CASE WHEN s.sex = 1 AND tr.age > 80 THEN 1 ELSE 0 END) AS '男80歲以上',
  SUM(CASE WHEN s.sex = 0 AND tr.age > 80 THEN 1 ELSE 0 END) AS '女80歲以上'
FROM `tr_table` tr
JOIN `sex_table` s ON tr.user_id = s.user_id;

邏輯深度解析

單條統計拆解

SUM(CASE WHEN s.sex=1 AND tr.age>=18 AND tr.age<=29 THEN 1 ELSE 0 END) AS '男18-29歲'
  1. CASE WHEN ... THEN 1 ELSE 0 END:將符合條件的行標記為 1,不符合為 0。
  2. SUM():對所有行的 0/1 求和,即得到符合條件的行數。
  3. 等價邏輯:`COUNT(CASE WHEN 條件 THEN 1 END)` 效果相同。

優化建議

  • 索引:在 `sex`、`age`、關聯鍵 `user_id` 上建立組合索引。
  • 年齡段維護:若區間頻繁變動,建議建立「年齡段字典表」Join 查詢,避免硬編碼修改 SQL。
  • 條件簡化:`tr.age BETWEEN 18 AND 29` 可替代 `>= AND <=`,可讀性更好。

執行結果示例

統計結果截圖

輸出為單行多列寬表,便於前端直接渲染報表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved