Group By複数のグループグループグループグループのグループグループグループのまとめ--GROPING SETS、GROUT BY CUBE、GROUTP BY ROLLUP、GROUTPING()、GROUTPING_ID()

4671 ワード

T-SQLの複数のグループには三つのGROPING SETS、CUBEがあります. また、ROLLUPは、CUBEとROLLUPがGROPING SETSの略字版として使用されても良いです.
サンプルデータベースのダウンロード:
http://files.cnblogs.com/files/haseo/TSQL2012.rar
GROUTPING 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、 YES AR(shipped date) )
2. ( shipperid )
3. ( YES AR(shipped date) )
4. ( )
 
ROOUP
グループセットを階層的に表示する
SELECT  shipcountry ,

        shipregion ,

        shipcity ,

        COUNT(*) AS numorders

FROM    Sales.Orders

GROUP BY ROLLUP(shipcountry, shipregion, shipcity);
1. ( shipcountry、 shipregion、 シプシティ )
2. ( shipcountry、 shipregion )
3. ( shipcountry )
4. ( )
 
GROUTPING()この関数は、持ち込まれた要素がグループの一部に属するかどうかを区別し、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);
 
GROUTPINGuID()
この関数は、パケット列のビットマップを返します.(バイナリを学んだ小仲間でも知っています.8421...これに類推します.)0であれば、すべてのパケットフィールドは、パケットの一部です.あるパケットフィールドがグループの一部ではないなら、対応する数字を返します.最後にまとめます.
以下のコードの場合、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);