GROUPING_ID的應用

sudn發表於2011-12-21

這是計算分組級別的函式。僅當指定了 GROUP BY 時,GROUPING_ID 才能在 SELECT

語法


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/,如需轉載,請註明出處,否則將追究法律責任。