1. 程式人生 > >SQL Server WITH ROLLUP、WITH CUBE、GROUPING語句的應用

SQL Server WITH ROLLUP、WITH CUBE、GROUPING語句的應用

toolbar then span 分組 table bsp group 生成 spa

CUBE:CUBE 生成的結果集顯示了所選列中值的所有組合的聚合。

ROLLUP:ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。

GROUPING:當行由 CUBE 或 ROLLUP 運算符添加時,該函數將導致附加列的輸出值為 1;當行不由 CUBE 或 ROLLUP 運算符添加時,該函數將導致附加列的輸出值為 0。

先創建一個臨時表:

技術分享圖片
 1 create table #temp
 2 (
 3     姓名    varchar(50) not null,
 4     課程    varchar(50)    null,
 5     分數    int        null
 6 )
 7 
 8 insert into #temp
 9 select ‘小紅‘,‘SQL‘,‘85‘ union 
10 select ‘小紅‘,‘C#‘,‘90‘ union 
11 select ‘小明‘,‘SQL‘,‘93‘ union 
12 select ‘小明‘,‘C#‘,‘82‘ union 
13 select ‘小李‘,‘SQL‘,‘88‘ union 
14 select ‘小李‘,‘C#‘,null
15 
16 select * from #temp
技術分享圖片

技術分享圖片

WITH CUBE:

1 select 姓名,課程,sum(分數) 
2 from #temp 
3 group by 姓名,課程
4 with cube

技術分享圖片

先以姓名分組和課程組合,再以姓名和課程分組進行組合。

PS:分類依據並不是根據select 中的順序,而是根據group by中的順序。

下面換個順序看看結果:

1 select 姓名,課程,sum(分數) 
2 from #temp 
3 group by 課程,姓名
4 with cube

技術分享圖片

先以課程分組和姓名組合,再以課程和姓名分組進行組合。

CUBE 生成的結果集顯示了所選列中值的所有組合的聚合。

WITH ROLLUP:

1 select 姓名,課程,sum(分數) 
2 from #temp 
3 group by 姓名,課程
4 with rollup

技術分享圖片

1 select 姓名,課程,sum(分數) 
2 from #temp 
3 group by 課程,姓名
4 with rollup

技術分享圖片

ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。

那麽這個某一層次結構是什麽呢?看一下上面的數據,當以姓名先分組時,分成了三組(不計最後一行合計),當以課程先分組時,分成了兩組(不計最後一行合計)。

這個某一層次結構我猜想應該跟 group by 的分組順序有關。

GROUPING:

grouping 與 with rollup 的結合(與with cube的結合是一樣的)

1 select 姓名,課程,sum(分數),GROUPING(姓名) 
2 from #temp 
3 group by 姓名,課程
4 with rollup

技術分享圖片

當 grouping 指定列為【姓名】時,只有最後一行是 with rollup 所添加的。

1 select 姓名,課程,sum(分數),GROUPING(課程) 
2 from #temp 
3 group by 姓名,課程
4 with rollup

技術分享圖片

當 grouping 指定列為【課程】時,第三行、第六行、第九行和最後一行是 with rollup 所添加的。

當行由 CUBE 或 ROLLUP 運算符添加時,該函數將導致附加列的輸出值為 1;當行不由 CUBE 或 ROLLUP 運算符添加時,該函數將導致附加列的輸出值為 0。

技術分享圖片
 1 select 姓名,
 2 case when GROUPING(姓名)=1 
 3      then ‘總計‘ 
 4      else 
 5         case when GROUPING(課程)=1 
 6              then ‘小計‘ 
 7              else 課程 end  
 8      end 課程,
 9 sum(分數)
10 from #temp 
11 group by 姓名,課程
12 with rollup
技術分享圖片

技術分享圖片

SQL Server WITH ROLLUP、WITH CUBE、GROUPING語句的應用