Oracle之CUBE与ROLLUP分析函数

1.建表并插入数据
--建立测试表
CREATE TABLE GROUP_TEST(
    ID NUMBER,
    NAME VARCHAR2(10),
    VALUE NUMBER,
    REMARKS VARCHAR2(255)
) SEGMENT CREATION IMMEDIATE;
 
--表注释(加注释是因为我对加注释的语句不熟悉。练习一下)
COMMENT ON TABLE GROUP_TEST IS '为了测试CUBE,ROLLUP,GROUPING,GROUPING_ID的区别';
COMMENT ON COLUMN GROUP_TEST.ID IS '序号';
COMMENT ON COLUMN GROUP_TEST.NAME IS '名字';
COMMENT ON COLUMN GROUP_TEST.VALUE IS '消费金额';
COMMENT ON COLUMN GROUP_TEST.REMARKS IS '备注';
 
--创建序列(序列之前都是用别人的。自己也建一个试试)
CREATE SEQUENCE SEQ_GROUP_TEST
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999;
 
--插入数据[记得COMMIT;]
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'marry',9,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'lee',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',9,'学习用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'marry',10,'学习用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'lee',15,'学习用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',16,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
INSERT INTO GROUP_TEST VALUES(SEQ_GROUP_TEST.NEXTVAL,'tom',8,'生活用品');
commit;
--查看插入的数据
SELECT * FROM GROUP_TEST;

--truncate table GROUP_TEST;
--drop SEQUENCE SEQ_GROUP_TEST;
--drop TABLE GROUP_TEST;

查询结果
在这里插入图片描述

**注意:**创建序列要在创建表时加(SEGMENT CREATION IMMEDIATE)具体原因

2.普通分组查看结果
--没有ROLLUP,CUBE是分组。
SELECT 
    NAME,
    REMARKS,
    SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY NAME,REMARKS;

在这里插入图片描述

3.ROLLUP分组

如果是ROLLUP(A, B)的话,首先会对(A、B)进行GROUP BY,然后对(A)进行GROUP BY,最后对全表进行GROUP BY操作。

--ROLLUP分组。[如果是ROLLUP(A, B)的话,首先会对(AB)进行GROUP BY,然后对(A)进行GROUP BY,最后对全表进行GROUP BY操作。]
SELECT 
    NAME,
    REMARKS,
    SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY ROLLUP(NAME,REMARKS);
/*
lee	    学习用品	15  
marry	学习用品	10
tom	    学习用品	9
tom	    生活用品	64
marry	生活用品	9
lee	    生活用品	8  --对(A、B)进行GROUP BY

tom		           73
lee		           23
marry		       19 --对(A)进行GROUP BY
		
                   115 --对全表进行GROUP BY
*/

在这里插入图片描述

3.1ROLLUP+GROUPING

结果不是很直观。现在加上GROUPING再看一下效果。
[0代表按他分组。1代表没有他分组。]

--结果不是很直观。现在加上GROUPING再看一下效果。[0代表按他分组。1代表没有他分组。]ROLLUPSELECT 
    GROUPING(NAME) G_NAME, 
    GROUPING(REMARKS) G_REMARKS,
    NAME,
    REMARKS,
    SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY ROLLUP(NAME,REMARKS) ORDER BY 1,2;
/*
0	0	lee	      生活用品	8
0	0	le        学习用品	15
0	0	tom	      学习用品	9
0	0	marry	  学习用品	10
0	0	marry	  生活用品	9
0	0	tom	      生活用品	64
0	1	tom		            73
0	1	marry		        19
0	1	lee		            23
1	1			            115
*/

在这里插入图片描述

  • GROUPING可以是合计列更清晰简单【ROLLUP】
--GROUPING可以是合计列更清晰,简单【ROLLUPSELECT 
      DECODE(GROUPING(NAME),1,'合计',NAME), 
      DECODE(GROUPING(REMARKS),1,'小计',REMARKS) ,
      SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY ROLLUP(NAME,REMARKS) ORDER BY 1,2;

在这里插入图片描述

3.2 ROLLUP+GROUPING_ID

GROUPING_ID效果与GROUPING大同小异
[0代表按他分组,
1代表按第一个分组,
2代表按第二个分组,
【3】代表不分组(此处的3。也可以是4.你懂的)]

--GROUPING_ID效果与GROUPING大同小异。[0代表按他分组,1代表按第一个分组,2代表按第二个分组,【3】代表不分组(此处的3。也可以是4.你懂的)]ROLLUPSELECT 
      GROUPING_ID(NAME,REMARKS) G_ID,
      NAME,
      REMARKS,
      SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY ROLLUP(NAME,REMARKS) ORDER BY 1;

在这里插入图片描述

  • GROUPING_ID可以是合计列更清晰,简单。与GROUPING差异不大
--GROUPING_ID可以是合计列更清晰,简单。与GROUPING差异不大【ROLLUPSELECT 
    DECODE(GROUPING_ID(NAME),1,'合计',NAME),
    DECODE(GROUPING_ID(REMARKS),1,'小计',REMARKS),
    SUM(VALUE)
    FROM GROUP_TEST 
GROUP BY ROLLUP(NAME,REMARKS) ORDER BY 1 ,2;

在这里插入图片描述

4.CUBE分组

如果是CUBE(A,B)的话,则首先会对(A、B)进行GROUP BY,然后依次是(A),(B)进行GROUP BY最后对全表进行GROUP BY操作。

--CUBE分组.[如果是CUBE(A,B)的话,则首先会对(AB)进行GROUP BY,然后依次是(A)(B)进行GROUP BY最后对全表进行GROUP BY操作。]
SELECT 
    NAME,
    REMARKS,
    SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY CUBE(NAME,REMARKS);

在这里插入图片描述

4.1CUBE+GROUPING
--GROUPINGCUBESELECT 
      GROUPING(NAME) G_NAME,
      GROUPING(REMARKS) G_REMARKS,
      NAME,REMARKS,
      SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY CUBE(NAME,REMARKS) ORDER BY 1,2;

在这里插入图片描述

  • 简洁写法:
--GROUPING合计,小计【CUBESELECT 
    DECODE(GROUPING(NAME),1,'合计',NAME), 
    DECODE(GROUPING(REMARKS),1,'小计',REMARKS) ,
    SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY CUBE(NAME,REMARKS) ORDER BY 1,2;

在这里插入图片描述

4.2CUBE+GROUPING_ID
--GROUPING_IDCUBESELECT 
    GROUPING_ID(NAME,REMARKS) G_ID,
    NAME,
    REMARKS,
    SUM(VALUE) 
FROM GROUP_TEST 
GROUP BY cube(NAME,REMARKS) ORDER BY 1;

在这里插入图片描述

  • 简洁写法
--GROUPING_ID合计,小计【CUBESELECT 
   DECODE(GROUPING_ID(NAME),1,'合计',NAME),
   DECODE(GROUPING_ID(REMARKS),1,'小计',REMARKS),
   SUM(VALUE)
FROM GROUP_TEST 
GROUP BY CUBE(NAME,REMARKS) ORDER BY 1 ,2;

在这里插入图片描述
以上是对CUBE,ROLLUP的示例以及讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值