[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

以上

时间: 2024-10-10 00:02:07

[SQL]-Oracle分组函数ROULLUP的应用的相关文章

[转]【ROLLUP】Oracle分组函数之ROLLUP魅力

原创:http://blog.itpub.net/519536/viewspace-610995 本文通过演示给出Oracle ROLLUP分组函数的用法,体验一下Oracle在统计查询领域中的函数魅力.ROLLUP分组函数可以理解为Group By分组函数封装后的精简用法,这里同时给出ROLLUP的Group By的改写思路. 1.初始化实验坏境1)创建测试表group_test[email protected]> create table group_test (group_id int,

ORACLE分组函数stddev和variance,我心存的疑问

方差函数VARIANCE(x),具体方法是: 设方差s,a为x1,x2...xn的平均值 ,则s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+--(xn-a)^2]/n 标准差函数STDDEV(x),具体算法是: 方差开方.设标准查为& ,则 &^2 = s 但是我通过以下的实验,发现oracle是这样计算variance()的, s = [(x1-a)^2+(x2-a)^2+(x3-a)^2+--(xn-a)^2]/n-1 ,注意不是除以n,而是n-1 ---------

oracle分组函数

分组函数:作用于一组值,并对一组数据返回一个值: 分组函数的使用: 常用的分组函数: Avg(求平均值),sum(求总和),min(求最小值),max(求最大值),count(求总个数),wm_concat(行转列) 例:select count( distinct deptno) from emp ; 行转列: select deptno 部门号,wm_concat(ename) 部门中员工的名字  from emp group by deptno; ---------------------

数据库SQL的分组函数

分组函数:(五个) 1···max(expr):求expr的最大值 }\ 2···min(expr):求expr的最小值 }-- 数据类型是有规定的 3···sum(expr):求expr的总和 }-- 必须是字符型或数字 4···avg(expr):求expr的平均值 }/ 5···count(expr):求expr的个数 expr的类型不能是空,如果是空,则不计入其中, 因此需要用到nvl()来进行转换 group by expr1,expr2,...的用法: group by 的后面跟的是

Oracle分组函数之ROLLUP

功能介绍: 首先是进行无字段的聚合,然后在对字段进行从左到右依次组合后聚合 创建表: 1 Create Table score 2 ( 3 classID Int, 4 studentName Varchar2(50), 5 subject varchar2(50), 6 score Int 7 ); 插入测试数据: 1 Insert Into score values (001,'小徐','语文',87); 2 Insert Into score values (001,'小徐','数学',9

oracle 分组函数、视图

组函数 分组函数作用于一组数据,对每一组返回一个值 组函数类型: 1.计数        count(列名 或 表达式)     对满足的行数进行统计 2.求和        sum(列名 或 表达式)       对数据进行和值计算,如 sum(grade) 计算总成绩 3.平均值    avg(列名 或 表达式)        对数据进行均值计算,如avg(grade)计算平均成绩 4.最大值    max(列名 或 表达式)       筛选最大的数据,如max(sum(grade))筛选

Oracle——分组函数

AVG(平均值)和 SUM (合计)函数 可以对数值型数据使用AVG 和 SUM 函数. AVG组函数忽略空值 --在组函数中使用NVL函数 --求平均值 sum(expr)/count(nvl(expr,0)) MIN(最小值)和 MAX(最大值)函数 可以对任意数据类型的数据使用 MIN 和 MAX 函数. SELECT MIN(hire_date), MAX(hire_date) FROM employees; COUNT(*) 返回表中记录总数,适用于任意数据类型. SELECT COU

Oracle分组函数cube VS rollup

分析函数cube和rollup魅力首先请看下面例子1)创建表create table group_test (group_id int, job varchar2(10), name varchar2(10), salary int);2)初始化表insert into group_test values (10,'Coding', 'Bruce',1000);insert into group_test values (10,'Programmer','Clair',1000);insert

Oracle分组函数之Grouping Sets

功能介绍: 自定义分组的字段 创建表: 插入测试数据: Grouping Sets(null,t.classid,(t.classid,t.studentname)),类似于ROLLUP Select t.classid,t.studentname,Sum(t.score) From Score t Group By Grouping Sets(null,t.classid,(t.classid,t.studentname)); 查询结果: Grouping Sets(null,t.classi