报表的小计、合计

    这几天做N多报表,前几天做的还相对简单点,直接在查询语句后面union select  sum() from ……,合计就自动加到数据的后面。不过要记得和前面的查询语句字段类型相同。

    今天的报表要根据机构有个小计,最后还有个合计。数据分成查询月份,与去年同期月份。select xxx,xxx,xxx,sum(x) a1,0 a2,……from table1  union all select xxx,xxx,xxx,0 a1,sum(x) a2,……from table2,然后以上这张表作为A表,关联机构表B表,然后查询A表与B表的数据,select xxx,xxx,xxx,sum(a1),sum(a2)…… from A,B where A.jgbh=B.jgbh group by xxx,xxx,xxx order by xxx,xxx,xxx。好,问题来了。我现在只要以第一个XXX为分组条件进行分组,怎么办呢?第二第三个XXX又必须出现在group by子句中。上网查了一下,用rollup函数。该函数可以为感兴趣的字段分组。rollup(a,b,c),依次以:rollup(a,b,c)、rollup(a,b)、rollup(a)进行分组。也就是说,先以a,b,c三个字段作为关键字(暂且这么说,我也不知道这么理解对不对)分组,在以上基础上,再以a,b作为关键字分组,最后以a作为关键字分组。什么意思?第一次分组,a,b,c只要有不同,都作为单独一组,统计。第二次,……哎,不知道怎么解释,明天再说,我酝酿一下。zzZZZZ……

    加班呐连续五周……

    前几天的报表做完,今天的报表的相对简单多了,前几天要加上去年同期的数据,多个union all,然后作为子表再查询。今天的报表只要有个合计就行了。也不想再用以前的方式,直接union个空的语句select '合计','',''……from xxx。换种方式,前几天不是学了rollup嘛。很简单,只要查询的时候多个grouping(xxx),xxx为rollup里的字段。这个什么意思呢?就是说,如果以xxx分组合计的话,grouping列的数据是1,如果是普通的数据,grouping列的数据是0。有啥用?就是前台界面要显示的问题啦,如果要显示合计,grouping是1,普通数据是0,前台判断一下,就可以正常显示了。

    前天说的rollup,想想其实也简单,如果你想对非聚合函数分组,举个例子吧。出发局,到达局,运输方式,sum件数,sum重量,sum费用。如果只想对出发局进行分组,只需要在rollup里(cfj,(jdj,ysfs)),这样会对出发局进行小计,然后,根据三个主键进行总计。如果不加括号,函数会对三个分别分组,也就是上面所说的,a,b,c。如果加上括号,只分两次组,(cfj,jdj,ysfs)和(cfj)。小计就是出发局(cfj)不同就计算小计,然后总计是根据三个主键一起进行分组总计,这样就达到了小计、合计的目的了。然后再结合前面的grouping,很容易就可以判断出哪个是小计,哪个是合计。因为合计是根据主键分组,所以grouping三个字段都是1;而小计是根据出发局(cfj)分的组,就只有grouping(cfj) 那一列是1,其它两个是0;然后剩下的全是0的就是普通的数据啦,前台小判断下,很好显示了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值