• 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);
  • 相关阅读:
    js在当前时间上加分钟数得到新的时间
    (转)@Autowired(required=false)注入注意的问题
    Java代替if和switch的方法(记录一下)
    windows下RocketMQ的安装部署
    RocketMQ在windows环境下的安装(转)
    简单说下二维数组
    JAVA-单例模式的几种实现方式
    (转)mybatis一级缓存二级缓存
    MySql安装后在服务管理器里边找不到MySql服务项的解决办法(win10)
    JAVA字符串的替换replace、replaceAll、replaceFirst的区别解析。
  • 原文地址:https://www.cnblogs.com/haseo/p/4299675.html
Copyright © 2020-2023  润新知