Case When的两种简单用法
用法一:
CASE season WHEN 'Spring' THEN '春天' WHEN 'Summer' THEN '夏天' WHEN 'autumn' THEN '秋天' else '冬天' end
用法二:
CASE WHEN season= 'Spring' THEN '春天' WHEN season= 'Summer' THEN '夏天' WHEN season= 'autumn' THEN '秋天' else '冬天' END
注意一:then和else之后的数据都是要进行放到同一个列一下的数据,所以这些数据类型要一致,否则SQL执行会报错的。
注意二:case when可以对非本列进行when的操作,也就是基于对别的column的计算来选择本column的值。
Case When的几个实例由浅入深
场景一:60岁以下上班,60-80退休,80以上死亡,其他为非人类
SELECT age, (CASE WHEN age >=0 AND age< 60 THEN '上班' WHEN age >= 60 AND age < 80 THEN '退休' WHEN age >= 80 THEN '死亡' ELSE '非人类' END) AS target FROM person
注意的是:我们甚至可以基于case when语句或者他的别名进行分组
SELECT max(age), (CASE WHEN age >=0 AND age< 60 THEN '上班' WHEN age >= 60 AND age < 80 THEN '退休' WHEN age >= 80 THEN '死亡' ELSE '非人类' END) AS target FROM person group by CASE WHEN age >=0 AND age< 60 THEN '上班' WHEN age >= 60 AND age < 80 THEN '退休' WHEN age >= 80 THEN '死亡' ELSE '非人类' END
场景二:并配合聚合函数做统计,统计各个城市的各类能耗
SELECT E_CODE, SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,--水耗 SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,--电耗 SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY--热耗 FROM THTF_ENERGY_TEST GROUP BY E_CODE
场景三:统计各个大洲共计有多少人口
国家(country) 人口(population) 中国 600 美国 100 加拿大 100 英国 200 法国 300 日本 250 德国 200 墨西哥 50 印度 250
想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case函数,SQL代码如下:
SELECT SUM(population), CASE country WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END FROM Table_A GROUP BY CASE country WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END;
注释:
上述语句可以这样理解,将
CASE country WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END
这个子句整体看作一列A,则 上述语句就是一句普通的分组语句了:SELECT SUM(population), A FROM Table_A GROUP BY A;
场景四:同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数
SQL代码如下:
SELECT CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END salary_class, COUNT(*) FROM Table_A GROUP BY CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END;