SQL中的CASE WHEN之分類聚合——MYSQL


今天有個SQL查詢需求,我第一個就想到用分類聚合查,不過寫半天都搞不出來,最后只好全部查出來后用PHP來進行統計。突然發現自己一直以來對CASE WHEN都不是很懂,於是搞完需求后去學習了一下。

原來CASE有兩種寫法,
一種是簡單CASE,CASE `列名` WHEN '值1' THEN ...  WHEN '值2' THEN ... END
一種是搜索CASE,CASE WHEN '判斷1' THEN ... WHEN '判斷2' THEN ... END
 
例如以下這個表格,想要每個id一行,統計game、work、eat的次數,應該怎么寫呢?
注:Mysql版本-5.6.39,表格名-t1
id type num
1 game 2
1 work 4
1 game 3
1 eat 1
2 game 2
2 work 9
2 eat 3
方法一(簡單CASE):
SELECT  
    `id`,
    sum(CASE `type` WHEN 'game' THEN `num` ELSE 0 END) AS `sum_game`,
    sum(CASE `type` WHEN 'work' THEN `num` ELSE 0 END) AS `sum_work`, 
    sum(CASE `type` WHEN 'eat' THEN `num` ELSE 0 END) AS `sum_eat`
FROM `t1`
GROUP BY `id`
方法二(搜索CASE):
SELECT  
    `id`,
    sum(CASE WHEN `type`='game' THEN `num` ELSE 0 END) AS `sum_game`,
    sum(CASE WHEN `type`='work' THEN `num` ELSE 0 END) AS `sum_work`, 
    sum(CASE WHEN `type`='eat' THEN `num` ELSE 0 END) AS `sum_eat`
FROM `t1`
GROUP BY `id`
查詢結果如下
id sum_game sum_work sum_eat
1 5 4 1
2 2 9 3
可以注意到簡單CASE有點類似switch,對一列進行判斷,用多個 WHEN ... THEN 表示不同的分支,用ELSE和END表示最后的default。
而搜索CASE有點類似if...else,用 WHEN...THEN... 表示多個else if,
 
分類聚合查詢搞出來了,但是原理還不是很清楚,於是把聚合函數去掉
SELECT  
    `id`,
    (CASE WHEN `type`='game' THEN `num` ELSE 0 END) as `game`,
    (CASE WHEN `type`='work' THEN `num` ELSE 0 END) as `work`, 
    (CASE WHEN `type`='eat' THEN `num` ELSE 0 END) as `num`
FROM `t1`
結果如下
 
id game work num
1 2 0 0
1 0 4 0
1 3 0 0
1 0 0 1
2 2 0 0
2 0 9 0
2 0 0 3
 
可以看到實際上是把type列,擴展成了三列,然后根據type的值,用num填充對應列,
最后加上GROUP BY 和聚合函數,就可以達到分類聚合的目的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM