sql 分组小计与合计语法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 分组小计与合计语法相关的知识,希望对你有一定的参考价值。

我想做一个分组的小计与合计,发现有一个问题
初始代码:select case when grouping(oil_name)=1 and grouping(oildepot_name)=0 then N'小计' else isnull(oildepot_name,'') end '出油库',case when grouping(oildepot_name)=1 then N'合计' else isnull(oil_name,'') end '油品',sum(qty) as '数量'from tb_Tally_SaleReceivables where unit_name='吨' group by oildepot_name,oil_name with rollup

显示的数据很正常
但是 当我加上单位一列之后:
select case when grouping(oil_name)=1 and grouping(oildepot_name)=0 then N'小计' else isnull(oildepot_name,'') end '出油库',case when grouping(oildepot_name)=1 then N'合计' else isnull(oil_name,'') end '油品',unit_name as '单位',sum(qty) as '数量'from tb_Tally_SaleReceivables where unit_name='吨' group by oildepot_name,oil_name,unit_name with rollup

就会多出一行小计行,问题可能出现在group by分组里面,现在我想问一下,怎么样才能避免图2的问题,就是说不管我怎么分组,小计行永远只会有一条 希望高手解答,高分送上

参考技术A group by oildepot_name,oil_name with rollup
改成
group by rollup(oildepot_name),oil_name
参考技术B 看图就知道是没办法合组呗,将NULL值ISNULL一下,看你这单位也没有第二种,直接就null时为吨,自然就能合组了呗 参考技术C 你解决的话能把代码贴上来吗?学习一下,谢谢追问

with rollup having ((grouping(oil_name)=0 and grouping(oildepot_name)=0 and grouping(unit_name)=0) or ( grouping(oil_name)=1 and grouping(oildepot_name)=0 and grouping(unit_name)=1 ) )
加上条件就好了

Oracle如何分组排序?

我用rollup和grouping生成了小计/合计行,然后想将数据按照时间倒序输出该怎么写。
我直接用order by会将小计行堆到一起。

参考技术A 最简单的上子查询即可:
select * from (原有SQL语句) order by 对应列名
参考技术B 给个建议,先order by排序 然后再生成了小计/合计行。追问

我试过,先用order by排好序,然后后面写rollup再运行顺序又变回去了

追答

可以试一试
(1)试验:你用order by以后的数据建立一个新表,这时新表的数据应该就是order by以后的,然后试一试rollup,这时有两种可能一种是可以,一种是不可以。

(2)如果可以,那么就可以尝试临时表了,就是每次查询前建立临时表(可以用存储过程或者包的方式自动实现),或者将数据以排好序的形式灌入临时表,然后在查询。(当然,额如果行的话视图没准也可以,不过为了查询快捷可能要建立物化视图)
(3)如果还不行,那就要麻烦一些,不知道开窗函数能不能做,需要试验了,不过就算能做也会有些麻烦,好不如直接用某些软件来的快。

以上是关于sql 分组小计与合计语法的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中多列“级联”约束的优雅语法?

Oracle如何分组排序?

T-SQL多个小计+合计,分类汇总

T-SQL多个小计+合计,分类汇总

用SQL实现统计报表中的“小计”和“合计”

SQL多个字段如何去重