如何通过Case语句实现无空值的年度销售同比数据列展示
如何用Case语句实现同比数据按列聚合展示
我正在对比YOY(同比)数据,尝试用Case语句按年份拆分数据。最初的写法是:
(Case When year(date) = 2010 Then 'sales year 2010' When year(date) = 2011 Then 'sales year 2011' Else End) as Year
但这种写法是把年份放在同一列的不同行,不符合我想要各年份数据按列展示的需求。
于是我调整成下面的写法:
(Case When year(date) = 2010 Then sum(sales) End) as 'sales year 2010', (Case When year(date) = 2011 Then sum(sales) End) as 'sales year 2011'
得到的结果是:
| Item | Sales Year 2010 | Sales Year 2011 |
|---|---|---|
| A | null | 2,500 |
| A | 5,000 | null |
| B | null | 200 |
| B | 7,000 | null |
| C | null | 2,500 |
| C | 5,000 | null |
| D | null | 200 |
| D | 7,000 | null |
我期望的结果是每个Item只显示一行,对应年份的销售额都在同一行:
| Item | Sales Year 2010 | Sales Year 2011 |
|---|---|---|
| A | 5,000 | 2,500 |
| B | 7,000 | 200 |
| C | 5,000 | 2,500 |
| D | 7,000 | 200 |
请问该如何实现这一需求?
解决方案
你需要把SUM()函数包裹在整个Case表达式外面,并且加上GROUP BY Item来按Item聚合数据,这样就能把同一个Item的不同年份销售额合并到一行。
正确的SQL写法如下:
SELECT Item, SUM(CASE WHEN YEAR(date) = 2010 THEN sales ELSE 0 END) AS 'sales year 2010', SUM(CASE WHEN YEAR(date) = 2011 THEN sales ELSE 0 END) AS 'sales year 2011' FROM your_table_name GROUP BY Item;
原理说明
- 之前的写法是先对每行数据判断年份后再求和,导致同一Item会拆分成多行;现在是先对符合年份条件的sales值求和,再按Item分组,自然就把同一Item的两年销售额合并到一行。
- 加上
ELSE 0可以避免出现null,如果希望没有数据时显示null,可以去掉ELSE 0。
执行上述SQL后,就能得到你期望的结果。
内容的提问来源于stack exchange,提问作者ItsKJ
相关产品推荐
相关产品推荐

