SQL Server的Grouping函數用法個人解讀

  1. Grouping 這個函數在SQL SERVER中是從2005版本才開始支持的。其功能抽象地說就是“分級彙總”。只有當 Group by 語句帶 with rollup/cute 選項時,Grouping 才有意義,才能使用。
  2. 先舉一簡單例子:
    declare @t table(Item varchar(10),Color varchar(10),Quantity int)
    insert  @t select 'Table','Blue', 124
    union all select 'Table','Red',  -23
    union all select 'Cup'  ,'Green',-23
    union all select 'Chair','Blue', 101
    union all select 'Chair','Red',  -90
    
    select * from @t
    
    select 
       item,
       sum(Quantity) [sum]
    from @t
    group by item
    
    select 
       item,
       sum(Quantity) [sum],
       grouping(item)
    from @t
    group by item with rollup
    
    select 
       item,
       color, 
       sum(Quantity) sum,
       grouping(item) grouping_item,
       grouping(color) grouping_color
    from @t
    group by item,color with rollup
    其結果如下:
    SQL Server的Grouping函數用法個人解讀_第1张图片
    第一張表是原始數據;第二張表是常規的不帶 rollup/cute 的 group by 語句,按 Item 彙總 Quantity 的結果;第三個比第二個多了個 rollup;第四個將 color 也加入了group by 的行列。對比一下結果後多少會有一個感性認識。
  3. 仔細觀察上面的查詢結果,可以發現,第二和第三個結果的主要區別在於第三個還做了一個總彙總,而第四個則是有好幾次彙總。Grouping 用於標記當前行是否是聚集的結果。
  4. 解讀:
    以 group by col1, col2,col3 with rollup 以例,這裏系統會認為 col3 為 col2 的子類,col2 為 col1 的子類,即相同的 col1 可能會對應用多個 col2,相同的col2 可能對應有多個col3。with rollup會分級彙總數據,group by 列表中從右至左依次彙總各個子類
    具體到上表就是一個 item 可能有多個 color,上面就是先在 item 相等的情況下彙總不同 color 所對應的quantity,最後item作為一類別,全部彙總。Gouping(col_name) 返回 1 的,表示此行彙總col_name。
  5. 最後在上述表的基礎上增加一個大類別,並將彙總行中為 NULL 的單元格做了更好理解的處理:
    declare @t table(groups char(2),item varchar(10),color varchar(10),quantity int)
    insert @t select 'aa','table','blue', 124
    union all select 'bb','table','red',  -23
    union all select 'bb','cup'  ,'green',-23
    union all select 'aa','chair','blue', 101
    union all select 'aa','chair','red',  -90  --汇总显示
    select 
        groups=case 
                   when grouping(groups)=1 then '总计'
                   when grouping(color) = 0 then groups
                   else '' 
               end,
        item=case 
                 when grouping(item)=1 and grouping(groups) = 0 then groups +'小计' -- 子類聚合好,上一級還沒完全聚合
                 when grouping(color)=0 then item -- 子類還沒聚好
                 else ''
             end,
        color=case 
                  when grouping(color)=0 then color    -- 子類還沒聚好
                  when grouping(color)=1 and grouping(item)=0 then item +'小计'  -- 子類聚合好,上一級還沒完全聚合
                  else ''
              end,
        quantity=sum(quantity)
    from @t
    group by groups,item,color with rollup
    結果:
    SQL Server的Grouping函數用法個人解讀_第2张图片
    非常明顯,就是對各級子類別的依次彙總。

你可能感兴趣的:(MSSQL开发-TSQL)