• 今天说一下 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

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

  • 相关阅读:
    IOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 转载
    iOS8.0 使用Photos.framework对相册的常用操作
    iOS 通用button 上图下字
    navigationItem的设置和titleView的设置
    iOS 设置导航栏 返回按钮文字隐藏
    iOS uitableivewCell 下划线顶格
    gitlab创建项目代码:
    iOS block用作属性封装代码
    iOS实录:GCD使用小结(一)
    代码处理 iOS 的横竖屏旋转
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5207410.html
Copyright © 2020-2023  润新知