grouping sets就是由多個group by聯合起來,關系如下。
select A , B from table group by grouping sets(A, B) 等價於
select A , null as B from table group by A
union all
select null as A , B from table group by B
2.grouping( )
grouping函數用來區分NULL值,這里NULL值有2種情況,一是原本表中的數據就為NULL,二是由rollup、cube、grouping sets生成的NULL值。
當為第一種情況中的空值時,grouping(NULL)返回0;當為第二種情況中的空值時,grouping(NULL)返回1。實例如下,從結果中可以看到第二個結果集中原本為null的數據由於grouping函數為1,故顯示ROLLUP-NULL字符串。
3.grouping_id( )
grouping_id函數也是計算分組級別的函數,注意如果要使用grouping_id函數那必須得有group by字句,而且group by字句的中的列與grouping_id函數的參數必須相等。比如group by A,B,那么必須使用grouping_id(A,B)。下面用一個等效關系來說明grouping_id()與grouping()的聯系,grouping_id(A, B)等效於grouping(A) + grouping(B),但要注意這里的+號不是算術相加,它表示的是二進制數據組合在一起,比如grouping(A)=1,grouping(B)=1,那么grouping_id(A, B)=11B,也就是十進制數3。原來的表數據執行下面的sql語句結果太多效果不明顯,所以我改了下表數據,不過對比兩個結果集效果很明顯。
轉載:https://www.cnblogs.com/fangyz/p/5813916.html