Group By 多個分組集小結 --GROUPING SETS,GROUP BY CUBE,GROUP BY ROLLUP,GROUPING(),GROUPING_ID()


T-SQL 多個分組集共有三種 GROUPING SETS, CUBE, 以及ROLLUP, 其中 CUBE和ROLLUP可以當做是GROUPING SETS的簡寫版

示例數據庫下載:

http://files.cnblogs.com/files/haseo/TSQL2012.rar

GROUPING SETS

列出所有你設置的分組集

SELECT shipperid, YEAR(shippeddate) AS shipyear, COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY GROUPING SETS
(
( shipperid, YEAR(shippeddate) ),
( shipperid ),
( YEAR(shippeddate) ),
( )
);


CUBE

列出所有可能的分組集

SELECT  shipperid ,
        YEAR(shippeddate) AS shipyear ,
        COUNT(*) AS numorders
FROM    Sales.Orders
GROUP BY CUBE(shipperid, YEAR(shippeddate));
1. ( shipperid, YEAR(shippeddate) )
2. ( shipperid )
3. ( YEAR(shippeddate) )
4. ( )
 
ROOLUP
以層級的方式列出分組集
SELECT  shipcountry ,
        shipregion ,
        shipcity ,
        COUNT(*) AS numorders
FROM    Sales.Orders
GROUP BY ROLLUP(shipcountry, shipregion, shipcity);
1. ( shipcountry, shipregion, shipcity )
2. ( shipcountry, shipregion )
3. ( shipcountry )
4. ( )
 

GROUPING()
該函數用來區分帶入的元素是否屬於分組的一部分, 返回0表示屬於,1表示不屬於

SELECT  shipcountry ,
        GROUPING(shipcountry) AS grpcountry ,
        shipregion ,
        GROUPING(shipregion) AS grpcountry ,
        shipcity ,
        GROUPING(shipcity) AS grpcountry ,
        COUNT(*) AS numorders
FROM    Sales.Orders
GROUP BY ROLLUP(shipcountry, shipregion, shipcity);

 

GROUPING_ID()

該函數返回分組列的位圖(學過二進制的小伙伴都懂的,8421...以此類推) ,如果是0則所有分組字段都是分組的一部分,如果某個分組字段不是分組集的一部分則返回對應數字(既相關二進制位置1),最后進行匯總。

如下代碼,如果shipcountry, shipregion, shipcity均是分組的一部分則返回0.  如果shipregion, shipcity 不在分組內,則是3 (0+2+1 )

SELECT  GROUPING_ID(shipcountry, shipregion, shipcity) AS grp_id ,
        shipcountry ,
        shipregion ,
        shipcity ,
        COUNT(*) AS numorders
FROM    Sales.Orders
GROUP BY ROLLUP(shipcountry, shipregion, shipcity);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM