case when 结合 sum函数失效

level2有合计 就取合计的那一项值,没有合计值,就自行进行sum汇总,但是并没有实现case when 的判断

img

img

但是明显他是所有都按照分组条件进行汇总了,并没有执行有合计只取合计那一项
我是按照 comcode , pubdate 进行group by分组的 第二个截图的出栏量 在每个pubdate底下 相当于合计项和子项又重复汇总了一遍

最直接的思路,先查一次合计的,然后再union all 一次没有合计的

select * fromwhere level2='合计'
union all
select * from 表 a where not exists 
(select 1 from 表 b where a.comcode=b.comcode and a.pubdate=b.pubdate and b.level2='合计')

另外一种思路,将合计和非合计的统计成两个字段分别统计,再判断原有的合计是否为0,为0则取非合计的统计值,不为0则取合计的统计值

select comcode ,pubdate,
case when 
sum(case when level2='合计' then 出栏量 else 0 end ) =0 then 
sum(case when level2<>'合计' then 出栏量 else 0 end )  
else 
sum(case when level2='合计' then 出栏量 else 0 end )
end 
fromgroup by comcode ,pubdate

其实上面两种方式,要么是按行拆开,要么是按列拆开,当然也有其他写法,但方向应该都是怎么把数据拆开,才方便进行统计

筛选掉合计项,直接求子项和可以吗


SELECT comcode, pubdate, SUM(outnum) FROM (SELECT comcode, pubdate,(CASE WHEN level2 = '合计' THEN 0 ELSE 出栏量 END) AS outnum FROM test) tmp GROUP BY comcode, pubdate

如果记录有id之类的主键,也可以把有合计项的子项筛选掉再分组求和