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

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