You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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' 

得到的结果是:

ItemSales Year 2010Sales Year 2011
Anull2,500
A5,000null
Bnull200
B7,000null
Cnull2,500
C5,000null
Dnull200
D7,000null

我期望的结果是每个Item只显示一行,对应年份的销售额都在同一行:

ItemSales Year 2010Sales Year 2011
A5,0002,500
B7,000200
C5,0002,500
D7,000200

请问该如何实现这一需求?


解决方案

你需要把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:24:12