GROUPING_ID的應用

本文介绍了GROUPING_ID函数的功能及用法,详细对比了GROUPING_ID与GROUPING的区别,并提供了技术定义与等效示例。

这是计算分组级别的函数。仅当指定了 GROUP BY 时,GROUPING_ID 才能在 SELECT 列表、HAVING 或 ORDER BY 子句中使用。

语法


GROUPING_ID ( [ ,...n ] )

GROUPING_ID 必须与 GROUP BY 列表中的表达式完全匹配。例如,如果按 DATEPART (yyyy, <column name>) 分组,则使用 GROUPING_ID (DATEPART (yyyy, <column name>));或者,如果按 <column name> 分组,则使用 GROUPING_ID (<column name>)。

比较 GROUPING_ID () 与 GROUPING ()

GROUPING_ID ( [ ,...n]) 将 GROUPING () 在每个输出行中为其列列表中的每个列返回的对应值作为 0、1 字符串输入。GROUPING_ID 将该字符串解释为二进制数并返回对应的整数。例如,请参考以下语句:SELECT a, b, c, SUM(d),GROUPING_ID(a,b,c)FROM T GROUP BY 。下表显示了 GROUPING_ID () 的输入值和输出值。

聚合的列

GROUPING_ID (a, b, c) 输入 = GROUPING(a) + GROUPING(b) + GROUPING(c)

GROUPING_ID () 输出

a

100

4

b

010

2

c

001

1

ab

110

6

ac

101

5

bc

011

3

abc

111

7

GROUPING_ID () 的技术定义

每个 GROUPING_ID 参数都必须是 GROUP BY 列表的一个元素。GROUPING_ID () 返回一个 integer 位图,其最低 N 位可能为文字。文字 bit 表明对应参数不是给定输出行的分组列。最低顺序 bit 对应于参数 N,第 N-1 个最低顺序 bit 对应于参数 1。

GROUPING_ID () 等效项

对于单个分组查询,GROUPING () 与 GROUPING_ID () 等价,两者均返回 0。

例如,以下语句是等价的:

SELECT GROUPING_ID(A,B)
FROM T
GROUP BY CUBE(A,B)

SELECT 3 FROM T GROUP BY ()
UNION ALL
SELECT 1 FROM T GROUP BY A
UNION ALL
SELECT 2 FROM T GROUP BY B
UNION ALL
SELECT 0 FROM T GROUP BY A,B

----以上來源:http://msdn.microsoft.com/zh-cn/library/bb510624.aspx

等價測試:

   select grouping_id('a','b')
     from dual
   group by cube('a','b')
  
  
SELECT 3 FROM dual GROUP BY ()
UNION ALL
SELECT 1 FROM dual GROUP BY 'a'
UNION ALL
SELECT 2 FROM dual GROUP BY 'b'
UNION ALL
SELECT 0 FROM dual GROUP BY 'a','b'

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16860121/viewspace-713678/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16860121/viewspace-713678/

在 Oracle 数据库中,`GROUPING_ID` 是一个用于分析 `GROUP BY` 查询结果的函数,常用于多维分析(如 `ROLLUP`、`CUBE` 和 `GROUPING SETS`)中,用于标识某个列是否参与了聚合操作中的“超级聚合”(即是否被汇总或折叠)。 --- ### 一、GROUPING_ID 的作用 `GROUPING_ID` 函数返回一个整数,表示在 `GROUP BY` 的某一行中哪些列是被“折叠”的(即该列在该行是汇总行,而不是明细行)。 它本质上是多个 `GROUPING()` 函数的组合,每个 `GROUPING()` 函数返回 0 或 1(0 表示是明细,1 表示是汇总),`GROUPING_ID()` 将这些值组合成一个二进制数,并转换为十进制整数。 --- ### 二、GROUPING_ID 的语法 ```sql GROUPING_ID( column1, column2, ..., columnN ) ``` - `column1, column2, ...` 是 `GROUP BY` 中的列。 - 返回值是一个整数,表示哪些列是汇总列。 --- ### 三、示例说明 #### 示例表:`sales` | region | product | amount | |--------|---------|--------| | North | A | 100 | | North | B | 200 | | South | A | 150 | | South | B | 250 | 我们使用 `ROLLUP` 来做分层汇总: ```sql SELECT region, product, SUM(amount) AS total, GROUPING(region) AS g_region, GROUPING(product) AS g_product, GROUPING_ID(region, product) AS grouping_id FROM sales GROUP BY ROLLUP(region, product); ``` #### 查询结果: | region | product | total | g_region | g_product | grouping_id | |--------|---------|-------|----------|-----------|-------------| | North | A | 100 | 0 | 0 | 0 | | North | B | 200 | 0 | 0 | 0 | | North | (null) | 300 | 0 | 1 | 1 | | South | A | 150 | 0 | 0 | 0 | | South | B | 250 | 0 | 0 | 0 | | South | (null) | 400 | 0 | 1 | 1 | | (null) | (null) | 700 | 1 | 1 | 3 | --- ### 四、GROUPING_ID 的计算方式 `GROUPING_ID(region, product)` 的值是: ``` GROUPING(region) * 2^1 + GROUPING(product) * 2^0 ``` 因为 `region` 是第一个参数,对应位权是 2^1,`product` 是第二个参数,对应位权是 2^0。 所以: - `GROUPING_ID(0,0)` → 0*2 + 0 = **0** → 明细数据 - `GROUPING_ID(0,1)` → 0*2 + 1 = **1** → 按 region 汇总 - `GROUPING_ID(1,1)` → 1*2 + 1 = **3** → 总汇总 --- ### 五、实际应用场景 1. **过滤特定层级的汇总行:** 例如,只显示按 `region` 的汇总行: ```sql SELECT region, product, SUM(amount) AS total FROM sales GROUP BY ROLLUP(region, product) HAVING GROUPING_ID(region, product) = 1; ``` 2. **动态判断行的聚合层级:** 可用于生成报表时,根据 `GROUPING_ID` 显示不同的行类型(明细行、小计行、总计行等)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值