源表rate:uname(姓名)、object(科目)、score(分數),縱向存儲。需轉為橫表:每行一學生,列為各科目分數。
SELECT DISTINCT uname AS '姓名',
SUM(CASE object WHEN 'chinese' THEN score END) AS '語文',
SUM(CASE object WHEN 'math' THEN score END) AS '數學',
SUM(CASE object WHEN 'physical' THEN score END) AS '物理'
FROM rate
GROUP BY uname;
CASE WHEN ... THEN score END:匹配科目返回分數,否則返回NULLSUM():忽略NULL,僅累加目標科目分數GROUP BY uname:按學生分組,每組產生一行結果科目不固定時,先查詢SELECT DISTINCT object FROM rate,應用層拼接CASE分支,再PREPARE/EXECUTE。
若每組每科目僅一條記錄,MAX(CASE...)語義更清晰,性能相近。
COALESCE(SUM(CASE...), 0) AS '語文' -- 無記錄顯示0而非NULL
INDEX idx_uname_object_score (uname, object, score)實現Index Only Scanuname哈希分區,並行聚合SUMMARY TABLE定時刷新條件聚合是MySQL行轉列標準、高效、可移植的最佳實踐,無需存儲過程或應用層循環。