zoukankan      html  css  js  c++  java
  • Oracle学习笔记:rollup、cube分组函数

    一、rollup函数

    1.介绍

    rollup() 俗名卷起函数,是为 group by() 的扩展函数。

    使用语法:group by rollup(a,b)

    说明:针对 a 列、b 列分别进行分组,再针对 (a,b) 组合列进行分组,最后汇总。

    分组的顺序对结果有影响。

    分组统计更加细化。

    2.实操

    单列分组

    平时使用 group by 进行分组汇总的时候,有时还需要进行累计,还得手动再计算一次。

    例如:

    select corp_name,
           count(1) as cnt
    from table_name
    group by corp_name
    
    汕头	3389
    河源	882
    清远	1852
    揭阳	1485
    深圳	4292
    珠海	1953
    东莞	16381
    梅州	1883
    中山	3075
    肇庆	1894
    云浮	9124
    广州	9198
    江门	2551
    惠州	2103
    茂名	1708
    潮州	1720
    韶关	2815
    汕尾	1255
    湛江	2540
    佛山	2842
    阳江	1401
    

    这个时候还想知道全省的累计数据的话,仍需手工计算。

    Oracle 提供一个 rollup() 函数可以多添加一行汇总数据。

    select nvl(corp_name, '全省') as corp_name
           count(1) as cnt
    from table_name
    group by rollup(corp_name)
    
    潮州	1720
    东莞	16381
    佛山	2842
    广州	9198
    河源	882
    惠州	2103
    江门	2551
    揭阳	1485
    茂名	1708
    梅州	1883
    清远	1852
    汕头	3389
    汕尾	1255
    韶关	2815
    深圳	4292
    阳江	1401
    云浮	9124
    湛江	2540
    肇庆	1894
    中山	3075
    珠海	1953
    全省	74343  -- 结果多了一行汇总数据
    

    多列分组

    针对地市、渠道进行统计汇总,情况如下。

    select corp_name,
           channel,
           count(1) as cnt
    from table_name
    group by corp_name,
             channel
    
    1	广州	电子渠道	5951
    2	汕头	其他	935
    3	汕尾	电子渠道	1224
    4	清远	自有实体	47
    5	潮州	电子渠道	884
    6	云浮	电子渠道	2612
    7	中山	政企直销	178
    8	深圳	其他	22
    9	韶关	其他	58
    10	阳江	其他	4
    11	潮州	政企直销	239
    

    利用 rollup() 函数进行汇总。

    select corp_name,
           channel,
           count(1) as cnt
    from table_name
    group by rollup(corp_name,
             channel)
    
    1	潮州	其他	53
    2	潮州	电子渠道	884
    3	潮州	社会实体	185
    4	潮州	政企直销	239
    5	潮州	自有实体	359
    6	潮州		1720
    7	东莞	其他	4417
    8	东莞	电子渠道	6266
    9	东莞	社会实体	317
    10	东莞	政企直销	461
    ...
    91	肇庆		1894
    92	中山	其他	62
    93	中山	电子渠道	2263
    94	中山	政企直销	178
    95	中山	自有实体	572
    96	中山		3075
    97	珠海	其他	752
    98	珠海	电子渠道	1201
    99	珠海		1953
    100			74343
    
    

    二、cube函数

    1.介绍

    cube() 函数是维度更细的统计,语法类似于 rollup() 函数。

    不同点在于 cube() 首先进行无字段的聚合,再依次对每个字段进行聚合。

    2.实操

    select corp_name,
           channel,
           count(1) as cnt
    from table_name
    group by cube(corp_name,
             channel)
             
    1			74343
    2		其他	12428
    3		电子渠道	45951
    4		社会实体	2148
    5		政企直销	3794
    6		自有实体	10022
    7	潮州		1720
    8	潮州	其他	53
    9	潮州	电子渠道	884
    10	潮州	社会实体	185
    11	潮州	政企直销	239
    12	潮州	自有实体	359
    13	东莞		16381
    14	东莞	其他	4417
    15	东莞	电子渠道	6266
    16	东莞	社会实体	317
    17	东莞	政企直销	461
    18	东莞	自有实体	4920
    19	佛山		2842
    20	佛山	其他	1114
    

    三、对比

    假设有 n 个维度,那么 rollup() 函数会有 n 个聚合,cube() 函数会有 2n 个聚合。

    • rollup 统计列

    rollup(a,b) 统计列包含:(a,b)、(a)、()

    rollup(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a)、()
    ....

    • cube 统计列

    cube(a,b) 统计列包含:(a,b)、(a)、(b)、()

    cube(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()

    参考链接1:Oracle的rollup语句详解

    参考链接2:Oracle分组函数之ROLLUP用法

    参考链接3:Oracle-rollup()函数

  • 相关阅读:
    洛谷——P1196 [NOI2002]银河英雄传说
    Bomb HDU
    LightOJ
    洛谷——P2657 [SCOI2009]windy数
    几校联考——day1题解
    CF997A Convert to Ones
    洛谷——P2574 XOR的艺术
    codevs 3164 质因数分解
    洛谷——P2865 [USACO06NOV]路障Roadblocks
    JS之ClassName属性使用
  • 原文地址:https://www.cnblogs.com/hider/p/13856814.html
Copyright © 2011-2022 走看看