【背景】
很多场景下,需要将长表根据不同的搜索条件GroupBy之后变成横向的短表,例如:
分公司 | 收益 | 年份 |
---|---|---|
a | 100 | 2022 |
b | 200 | 2022 |
c | 300 | 2022 |
a | 400 | 2021 |
b | 500 | 2021 |
c | 600 | 2021 |
想要变化为:
分公司 | 2022收益 | 2021收益 |
---|---|---|
a | 100 | 400 |
b | 200 | 500 |
c | 300 | 600 |
笨办法是分别通过where 年份=2021和where 年份=2022并以分公司groupby后获得相同结构的列,然后以分公司为条件进行join。这种写法的问题在于有几列就要写几个相同结构的子查询,然后将所有列Join,非常繁杂且难于维护。
【更简洁的写法】
用case when配合sum:
SELECT分公司,SUM(CASE WHEN YEAR(年份) = 2022 THEN 收益 END) AS 2022收益,SUM(CASE WHEN YEAR(年份) = 2021 THEN 收益 END) AS 2021收益
FROMtransactions
GROUP BY分公司;
一个查询就可以搞定,而且非常便于维护。