介绍一种非常好用汇总数据的方式GROUPING SETS

介绍一种非常好用汇总数据的方式GROUPING SETS

介绍

  对于任何人而言,用T-SQL语句来写聚会查询都是工作中重要的一环。我们大家也都很熟悉GROUP BY子句来实现聚合表达式,但是如果打算在一个结果集中包含多种不同的汇总结果,可能会比较麻烦。我将举例展示给大家使用GROUPING SETS操作符来完成这个“混合的结果集”。

  或许当我们在打算分析较大规模的数据集时,不知道从何下手,此时处理这种情况最好的方式就是汇总数据,快速的得到一个数据预览。

在T-SQL中,使用GROUP BY子句在一个聚合查询中来汇总需要的数据。这个子句由一组表达式定义的分组构成。结果集中每一行返回GROUP BY 子句中表达式的唯一值或者组合,并且聚合函数,像COUNT或者SUM等可以对查询中的任何行进行聚合。但是,如果你想要多种不同组合的聚合时,一般有两种方式:

  1.将不懂组合聚合的结果集UNIONALL在一起。

  2.使用 GROUPING SETS操作符,结合GROUP BY一起在一个语句中实现。

 

本文中,我会展示如何使用GROUPING SETS来实现这一目的。

准备数据集

本文中所有的查询都使用AdventureWorks2012 数据库中的数据,这里提供一个下载地址方便使用(AdventureWorks2012

实例: Data Analyst at Adventure Works

 

比如你是一个数据分析师,对于公司今年的收入很感兴趣。这意味着你需要分组汇总公司的每一年的收入,查询语句如下:

Query 1. 汇总每年收入

 

 

Query 1 返回结果集:

OrderYear

Income

2005

11331809

2006

30674773.2

2007

42011037.2

2008

25828762.1

 

 

根据这个结果集,可知该公2005到2008年的收入情况。这类数据信息对于商业分析来说很常见。

但是,如果你想要更多关于收入的信息,比如其他汇总条件,你必须要重新运行一个GROUP BY子句。比如查询返回公司每个月的收入情况。查询语句如下:

Query 2. 公司每个月的收入

 

 

结果集如下:

OrderYear

OrderMonth

Income

2005

7

962716.742

2005

8

2044600

2005

9

1639840.11

2005

10

1358050.47

2005

11

2868129.2

2005

12

2458472.43

2006

1

1309863.25

2006

2

2451605.62

2006

3

2099415.62

2006

4

1546592.23

2006

5

2942672.91

2006

6

1678567.42

2006

7

2894054.68

2006

8

4147192.18

2006

9

3235826.19

2006

10

2217544.45

2006

11

3388911.41

2006

12

2762527.22

2007

1

1756407.01

2007

2

2873936.93

2007

3

2049529.87

2007

4

2371677.7

2007

5

3443525.25

2007

6

2542671.93

2007

7

3554092.32

2007

8

5068341.51

2007

9

5059473.22

2007

10

3364506.26

2007

11

4683867.05

2007

12

5243008.13

2008

1

3009197.42

2008

2

4167855.43

2008

3

4221323.43

2008

4

3820583.49

2008

5

5194121.52

2008

6

5364840.18

2008

7

50840.63

 

 

这个结果集要比之前的更详细一点。可以得到具体某个月的收入汇总。显然GROUP BY 后面的列越多其越详细,结果一般也越多(除非有传递依赖键)。

如果你仔细观察两个查询,你会发现他们都是根据个子的分组表达式进行分组汇总的。前面的是按照年,后面的是按照年和月。

假如我想查看两种汇总结果在一个结果集中应该怎么处理那?为了实现这个目标,我们前面说了两个方案,方案1就是使用UNION ALL,代码如下: 

 

Query 3. 公司收入(每年|每月)

 

 

结果集如下图所示:

<span>介绍一种非常好用汇总数据的方式GROUPING SETS</span>

  

其中红色框内为按照年的汇总数据。蓝色框内为按照年和月的分组汇总。

如图所示两个结果集被合并在一起了。注意。此时NULL出现在里面,使用NULL作为假列来标识order year分组的结果。因为按年分组没有这个列。

尽管你已经获得了想要的结果,但是这样需要完成两次的语句,接下来我们尝试一下grouping set,方案2。因为我们都是懒人吗,所以这个方式一定要更加简单。目的就是“更少代码,相同结果”。接下来我们详细看一下:

Query 4.使用 GROUPING SETS实现相同结果 

 

结果集跟之前的一模一样。但是新的代码要少很多。GROUPING SETS 操作符要和GROUP  BY 子句在一起使用。并且允许我们可以做一个多分组的查询。尽管如此,我们要仔细检查指定的分组集。例如假如一个分组包含两个列,假设列A和B,两个列都需要包含在括号内:(column A, column B)。如果没有括号,这个子句将会被定义为独立的分组,结果就不同了。

上面语句的结果如下:

http://www.sqlservercentral.com/Images/33650.jpg

 

 

顺便说一下,如果我们打算聚合整个结果集(不分组聚合所有数据),只需要添加有一个空的括号在分组集里面即可。查询语句如下:

Query 5. 加入总体汇总结果

 

 

 

结果如图:

<span>介绍一种非常好用汇总数据的方式GROUPING SETS</span>

注意最下方的42行,年月都为null,这个查询汇总了郑铁的所有收入,因为没有进行任何分组。

注意,需要强调一个十强,一定要确保分组列字段部位NULL,因此NULLS不能被用作分组列在GROUPING SETS中使用。如果非要那个为空字段,需要使用 GROUPING 或者 GROUPING_ID 函数判断是否NULL来自GROUPING SETS 操作符。

总结

本篇文章中,主要介绍如何使用另一种聚合查询方式来实现多种分组聚合结果的合并。熟悉后你会发现这种方式对于总结汇总数据非常有帮助,大大提高了我们代码的效率。

原文地址

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119689.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月26日 下午9:00
下一篇 2021年11月26日 下午10:00


相关推荐

  • vim 搜索命令_linux vim编辑器

    vim 搜索命令_linux vim编辑器VIM查找命令VIM命令功能f向前搜索并将光标停留在目标字符上F向后搜索并将光标停留在目标字符上;重复刚才的查找,反向重复刚才的查找t向前搜索并将光标停留在目标字符的前一个字符上T向后搜索并将光标停留在目标字符的后一个字

    2026年2月24日
    5
  • 游戏化方式学习Git指令

    游戏化方式学习Git指令learnGitBranching,它是一个基于虚拟化技术和沙盒技术,开发的网页游戏项目。能够让我们开发人员非常方便和清晰的理解git的各个命令的详细功能和作用。

    2022年5月27日
    32
  • Lua 语言

    Lua 语言Lua 是一种轻量语言 它的官方版本只包括一个精简的核心和最基本的库 这使得 Lua 体积小 启动速度快 它用标准 C 语言编写并以源代码形式开放 编译后仅仅一百余 K 可以很方便的嵌入别的程式里 和许多 大而全 的语言不一样 网路通讯 图形界面等都没有默认提供 但是 Lua 可以很容易地被扩展 由宿主语言 通常是 C 或 C 提供这些功能 Lua 可以使用它们 就像是本来就内置的功能一样 事实上 现在已经有很多成熟

    2026年3月17日
    1
  • Python调用文心一言API:从基础到进阶的完整指南

    Python调用文心一言API:从基础到进阶的完整指南

    2026年3月12日
    1
  • 图像处理-小波变换

    图像处理-小波变换小波指的是一种能量在时域非常集中的波 它的能量有限 都集中在某一点附近 而且积分的值为零 这说明它与傅里叶波一样是正交波 图像的傅里叶变换是将图像信号分解为各种不同频率的正弦波 同样 小波变换是将图像信号分解为由原始小波位移和缩放之后的一组小波 小波在图像处理里被称为图像显微镜 原因在于它的多分辨率分解能力可以将图片信息一层一层分解剥离开来 剥离的手段就是通过低通和高通滤波

    2026年3月18日
    2
  • abaqus6.14.4安装_abaqus激活成功教程教程

    abaqus6.14.4安装_abaqus激活成功教程教程密码zo32

    2025年10月18日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号