[SQL]-Oracle分组函数ROULLUP的应用

首先部分说明:
Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。

因工作要做个报表,因此想就在数据库直接跑个报表出来,取公司部分数据整理如下:

SELECT CLP.ITEMNAME AS PORVINCE,
       CLC.ITEMNAME AS CITY,
       SUM(CASE WHEN C2.ITEMNAME= '标准产品' THEN C.BUSINESSSUM ELSE 0 END) AS 标准产品,
       SUM(CASE WHEN C2.ITEMNAME= 'VIP产品' THEN C.BUSINESSSUM ELSE 0 END) AS VIP产品,
       SUM(C.BUSINESSSUM) AS 总计

  FROM BUSINESS_CONTRACT C
  LEFT JOIN STORE_INFO S
         ON C.STORES = S.SNO
  LEFT JOIN CODE_LIBRARY CLP
         ON S.PROVINCE = CLP.ITEMNO
        AND CLP.CODENO = 'ProvinceCodeByHand'
  LEFT JOIN CODE_LIBRARY CLC
         ON S.CITY = CLC.ITEMNO
        AND CLC.CODENO = 'CityCodeByHand'
  LEFT JOIN business_type T
         ON C.BUSINESSTYPE=T.TYPENO
  LEFT JOIN CODE_LIBRARY c2
         ON T.PROMOTIONTYPE = C2.ITEMNO
        AND C2.CODENO = 'PromotionType'

WHERE CLP.ITEMNAME='广东省'OR CLP.ITEMNAME='湖南省'
GROUP BY CLP.ITEMNAME,CLC.ITEMNAME

查询结果:
这里写图片描述
在这里需要在最后加一行汇总行,这里可以用到自动汇总函数ROULLUP,与GROUP BY连用,写法如下:

GROUP BY ROLLUP(CLP.ITEMNAME,CLC.ITEMNAME

结果如下:
这里写图片描述
会发现,该函数会对广东省及湖南省都有个小总计,最后是全部的总计,如果只需要对全部做一个总计,可以使用grouping_id进行美化,代码如下:

GROUP BY ROLLUP(CLP.ITEMNAME,CLC.ITEMNAME)
HAVING grouping_id(CLP.ITEMNAME,CLC.ITEMNAME)!=1

结果如下:
这里写图片描述
这里对grouping_id说明:
总计是grouping_id=3
小计grouping_id=1
记录是grouping_id=0

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值