zoukankan      html  css  js  c++  java
  • 今天说一下 Group by 这个东西

    group by 这个关键字,这个语句太平凡了~基本上只要有报表的地方,就会有它的身影。

    常规用法就是

    INSERT INTO #TypeValue
            ( TypeID, Col2 )
    VALUES  (1 , N'名称1'),(1 , N'名称2'),(2 , N'名称3'),(2, N'名称3'),(3 , N'名称4'),(3 , N'名称5'),(4 , N'名称6'),(4 , N'名称6'),(5 , N'名称7')
    
    
    SELECT TypeID,Col2,COUNT(*) AS Qty
        FROM #TypeValue         
            GROUP BY TypeID,Col2
    
    TypeID      Col2                                               Qty
    ----------- -------------------------------------------------- -----------
    1           名称1                                                1
    1           名称2                                                1
    2           名称3                                                2
    3           名称4                                                1
    3           名称5                                                1
    4           名称6                                                2
    5           名称7                                                1

    一个语法原则就是,除非用到聚合的关键字或者常量(比如 count啊,sum啊,AVG啊之类的),其它出现的字段都必须出现在 group by 之后,并且不能用别名,就比如随便改一下上面那个句子,这里面只能把整个case 放到group by 里面,而并不能直接group by DisplayName 。就是这个道理

    SELECT TypeID,CASE WHEN Col2 IN ('名称1','名称2') THEN 1
                       WHEN Col2 IN ('名称3','名称4') THEN 2
                       WHEN Col2 IN ('名称5','名称6') THEN 3
                       ELSE 4 END AS DisplayName,COUNT(*) AS Qty
        FROM #TypeValue         
            GROUP BY TypeID,CASE WHEN Col2 IN ('名称1','名称2') THEN 1
                       WHEN Col2 IN ('名称3','名称4') THEN 2
                       WHEN Col2 IN ('名称5','名称6') THEN 3
                       ELSE 4 END

    还有一个不大规范的用法 Group By ALL 这个用法,在未来的版本应该会废除,但是废除之前呢~还是可以用的(只是一般不建议),我也介绍一下。这个All 的场景很简单,就是在查询聚合的时候。在where 的限定条件里面过滤了一部分的数据。但是对于聚合的行数是没有任何的影响的,看个实例你就会明白

    SELECT TypeID,Col2,COUNT(*) AS Qty
        FROM #TypeValue
            WHERE TypeID < 4
            GROUP BY TypeID,Col2
    
    TypeID      Col2                                               Qty
    ----------- -------------------------------------------------- -----------
    1           名称1                                                1
    1           名称2                                                1
    2           名称3                                                2
    3           名称4                                                1
    3           名称5                                                1
    
    SELECT TypeID,Col2,COUNT(*) AS Qty
        FROM #TypeValue     
        WHERE TypeID < 4
            GROUP BY ALL TypeID,Col2
    
    TypeID      Col2                                               Qty
    ----------- -------------------------------------------------- -----------
    1           名称1                                                1
    1           名称2                                                1
    2           名称3                                                2
    3           名称4                                                1
    3           名称5                                                1
    4           名称6                                                0
    5           名称7                                                0

    第一个语句在查询出来的结果,字节把TypeID >=4 的,直接就不返回了。而第二个语句,TypeID >= 4 的,还留下个框架在。这个就是加了 All 关键字的影响。

    还有一些可能用到的.比方说cube 。效果就是在group by 的每一项,从右到左都生成一个聚合行。简单举例又来改一下我们例子的语句。当中有些Null的行,对!就是聚合出来的啦~最后还有一个全部的总聚合╮(╯_╰)╭

    SELECT TypeID,Col2,COUNT(*) AS Qty
        FROM #TypeValue
            GROUP BY ROLLUP (TypeID,Col2)
    TypeID      Col2                                               Qty
    ----------- -------------------------------------------------- -----------
    1           名称1                                                1
    1           名称2                                                1
    1           NULL                                               2
    2           名称3                                                2
    2           NULL                                               2
    3           名称4                                                1
    3           名称5                                                1
    3           NULL                                               2
    4           名称6                                                2
    4           NULL                                               2
    5           名称7                                                1
    5           NULL                                               1
    NULL        NULL                                               9

    当然罗,有的伙伴说,然而我只需要你把总数聚合出来就ok啦!其它结果集臣妾不需要啊!OK啊,改下就行了啊~需要的是将 Rollup后面的子集用 () 包起来,因为这里面是判断集合的~so ~就行了,还有一个 ,当使用rollup 的时候,会有一个Grouping的行数标志是否是rollup 产生的聚合行~如果需要对聚合行赋值~注意数据类型的转换哦~

    SELECT  CASE WHEN GROUPING(TypeID) = 1 THEN '合计' ELSE RTRIM(TypeID) END AS TypeID,
            Col2,COUNT(*) AS Qty
        FROM #TypeValue
            GROUP BY ROLLUP ((TypeID,Col2))
    
    TypeID       Col2                                               Qty
    ------------ -------------------------------------------------- -----------
    1            名称1                                                1
    1            名称2                                                1
    2            名称3                                                2
    3            名称4                                                1
    3            名称5                                                1
    4            名称6                                                2
    5            名称7                                                1
    合计           NULL                                               9

    好~今天说道这里~祝各位元宵节阖家安康

  • 相关阅读:
    DB2 for Z/os Statement prepare
    Foreign key (referential) constraints on DB2 LUW v105
    复制Informational constraints on LUW DB2 v105
    DB2 SQL Mixed data in character strings
    DB2 create partitioned table
    MVC中使用EF的技巧集(一)
    Asp.Net MVC 开发技巧(二)
    Linq使用技巧及查询示例(一)
    Asp.Net MVC 开发技巧(一)
    Asp.Net MVC Identity 2.2.1 使用技巧(八)
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5207410.html
Copyright © 2011-2022 走看看