面试的时候被问到的,第一想法是python里面pandas的用法,然后完全想不到sql要怎么做,现在来总结一下。
1. 理解列转行
假定我们有一个长数据表如下:
table:
year | month | amount |
---|---|---|
2018 | 1 | 20 |
2018 | 2 | 90 |
2018 | 3 | 50 |
2018 | 4 | 30 |
2018 | 1 | 20 |
2019 | 2 | 60 |
2019 | 3 | 10 |
2019 | 4 | 10 |
想要实现列转行,把长数据变成宽数据,即将month中的类别全部变成单变量,其对应的元素即为amunt的统计数量
如下表:
year | m1 | m2 | m3 | m4 |
---|---|---|---|---|
2018 | 40 | 90 | 50 | 30 |
2019 | 0 | 60 | 10 | 10 |
所以实际上做的事情就是聚合分组。
2.sql实现
思路:
- 对year进行group by
- 对month进行判断,生成新的列属性
代码如下:
SELECT year,
SUM(CASE WHEN month = 1 THEN amount ELSE 0 END) as m1,
SUM(CASE WHEN month = 2 THEN amount ELSE 0 END) as m2,
SUM(CASE WHEN month = 3 THEN amount ELSE 0 END) as m3,
SUM(CASE WHEN month = 4 THEN amount ELSE 0 END) as m4,
FROM table
GROUP BY year
注:记得要写 END