[MSDN] GROUP BY (Transact-SQL)
来源: https://msdn.microsoft.com/zh-cn/library/ms177673(v=sql.110).aspx
按 SQL Server 中一个或多个列或表达式的值将一组选定行组合成一个摘要行集。 针对每一组返回一行。 SELECT 子句 <select> 列表中的聚合函数提供有关每个组(而不是各行)的信息。
GROUP BY 子句具有符合 ISO 的语法和不符合 ISO 的语法。 在一条 SELECT 语句中只能使用一种语法样式。 对于所有的新工作,请使用符合 ISO 的语法。 提供不符合 ISO 的语法的目的是为了实现向后兼容。
在本主题中,GROUP BY 子句可以描述为常规或简单子句:
常规 GROUP BY 子句包括 GROUPING SETS、CUBE、ROLLUP、WITH CUBE 或 WITH ROLLUP。
简单 GROUP BY 子句不包括 GROUPING SETS、CUBE、ROLLUP、WITH CUBE 或 WITH ROLLUP。 GROUP BY ()(也就是总计)被视为简单 GROUP BY。
语法
ISO-Compliant Syntax GROUP BY <group by spec> <group by spec> ::=
<group by item> [ ,...n ] <group by item> ::=
<simple group by item>
| <rollup spec>
| <cube spec>
| <grouping sets spec>
| <grand total> <simple group by item> ::=
<column_expression> <rollup spec> ::=
ROLLUP ( <composite element list> ) <cube spec> ::=
CUBE ( <composite element list> ) <composite element list> ::=
<composite element> [ ,...n ] <composite element> ::=
<simple group by item>
| ( <simple group by item list> ) <simple group by item list> ::=
<simple group by item> [ ,...n ] <grouping sets spec> ::=
GROUPING SETS ( <grouping set list> ) <grouping set list> ::=
<grouping set> [ ,...n ] <grouping set> ::=
<grand total>
| <grouping set item>
| ( <grouping set item list> ) <empty group> ::=
( ) <grouping set item> ::=
<simple group by item>
| <rollup spec>
| <cube spec> <grouping set item list> ::=
<grouping set item> [ ,...n ]
Non-ISO-Compliant Syntax
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]
参数
- <column_expression>
-
针对其执行分组操作的表达式。
- ROLLUP ( )
-
生成简单的 GROUP BY 聚合行以及小计行或超聚合行,还生成一个总计行。
返回的分组数等于 <composite element list> 中的表达式数加一。 例如,请考虑下面的语句。
SELECT a, b, c, SUM ( <expression> )
FROM T
GROUP BY ROLLUP (a,b,c);会为 (a, b, c)、(a, b) 和 (a) 值的每个唯一组合生成一个带有小计的行。 还将计算一个总计行。
列是按照从右到左的顺序汇总的。 列的顺序会影响 ROLLUP 的输出分组,而且可能会影响结果集内的行数。
- CUBE ( )
-
生成简单的 GROUP BY 聚合行、ROLLUP 超聚合行和交叉表格行。
CUBE 针对 <composite element list> 中表达式的所有排列输出一个分组。
生成的分组数等于 (2n),其中 n = <composite element list> 中的表达式数。 例如,请考虑下面的语句。
SELECT a, b, c, SUM (<expression>)
FROM T
GROUP BY CUBE (a,b,c);会为 (a, b, c)、(a, b)、(a, c)、(b, c)、(a)、(b) 和 (c) 值的每个唯一组合生成一个带有小计的行,还会生成一个总计行。
列的顺序不影响 CUBE 的输出。
- GROUPING SETS ( )
-
在一个查询中指定数据的多个分组。 仅聚合指定组,而不聚合由 CUBE 或 ROLLUP 生成的整组聚合。 其结果与针对指定的组执行 UNION ALL 运算等效。 GROUPING SETS 可以包含单个元素或元素列表。 GROUPING SETS 可以指定与 ROLLUP 或 CUBE 返回的内容等效的分组。 <grouping set item list> 可以包含 ROLLUP 或 CUBE。
SELECT a, b, c, COUNT(*)
FROM T
GROUP BY GROUPING SET((a,b,c),(a,b),());( )
空组生成总计。
注释
GROUP BY 子句中的表达式可以包含 FROM 子句中表、派生表或视图的列。 这些列不必显示在 SELECT 子句 <select> 列表中。
<select> 列表中任何非聚合表达式中的每个表列或视图列都必须包括在 GROUP BY 列表中:
允许使用下面的语句:
SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA + ColumnB;
SELECT ColumnA + ColumnB + constant FROM T GROUP BY ColumnA, ColumnB;不允许使用下面的语句:
SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA + ColumnB;
SELECT ColumnA + constant + ColumnB FROM T GROUP BY ColumnA + ColumnB;
如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每组的汇总值。 这些函数称为矢量聚合。
执行任何分组操作之前,不满足 WHERE 子句中条件的行将被删除。
HAVING 子句与 GROUP BY 子句一起用来筛选结果集内的组。
GROUP BY 子句不能对结果集进行排序。 使用 ORDER BY 子句可以对结果集进行排序。
如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。
不能使用带有别名的 GROUP BY 来替换 AS 子句中的列名,除非别名将替换 FROM 子句内派生表中的列名。
将不删除 GROUPING SETS 列表中的重复分组集。 在以下情况下可能会生成重复分组集:多次指定一个列表达式,或者在 GROUPING SETS 列表中列出同样由 CUBE 或 ROLLUP 生成的列表达式。
ROLLUP、CUBE 和 GROUPING SETS 支持区分聚合,例如,AVG (DISTINCT column_name)、COUNT (DISTINCTcolumn_name) 和 SUM (DISTINCT column_name)。
不能在索引视图中指定 ROLLUP、CUBE 和 GROUPING SETS。
不能直接针对具有 ntext、text 或 image 的列使用 GROUP BY 或 HAVING。 这些列可以在返回其他数据类型的函数(如 SUBSTRING() 和 CAST())中用作参数。
不能直接在 <column_expression> 中指定 xml 数据类型方法。 相反,可引用内部使用 xml 数据类型方法的用户定义函数,或引用使用这些数据类型方法的计算列。
对于 GROUPING SETS、ROLLUP 和 CUBE 的 GROUP BY 限制
语法限制
在 GROUP BY 子句中,不允许使用 GROUPING SETS,除非它们是 GROUPING SETS 列表的一部分。 例如,不允许使用 GROUP BY C1, (C2,..., Cn),但允许使用 GROUP BY GROUPING SETS (C1, (C2, ..., Cn))。
不允许在 GROUPING SETS 内部使用 GROUPING SETS。 例如,不允许使用 GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3))。
在具有 ROLLUP、CUBE 或 GROUPING SETS 关键字的 GROUP BY 子句中,不允许使用不符合 ISO 的 ALL、WITH CUBE 和 WITH ROLLUP 关键字。
大小限制
对于简单的 GROUP BY 子句,针对表达式数量没有任何限制。
对于使用 ROLLUP、CUBE 或 GROUPING SETS 的 GROUP BY 子句,表达式的最大数量是 32,可以生成的分组集的最大数量是 4096。
[MSDN] GROUP BY (Transact-SQL)的更多相关文章
- group by的SQL语句
有一张项目表 CREATE TABLE [ProjectTable] ( [ProjectID] NVARCHAR(16) NOT NULL, [ProjectName] NVARCHAR(20) N ...
- mysql分组GROUP BY常用sql
数据分组 GROUP BY GROUP BY可以根据一个或多个字段进行分组. 比如,根据prod_id分组: SELECT prod_id ,user_id FROM products GROUP B ...
- Part 6 Group by in sql server
- Linux 上配置 SQL Server Always On Availability Group
SQL Server Always On Availability Group 配置步骤:配置三台 Linux 集群节点创建 Availability Group配置 Cluster Resource ...
- sql语句Group By用法-转载
sql语句Group By用法一则 2007-10-25 12:00 sql语句Group By用法一则 如果我们的需求变成是要算出每一间店 (store_name) 的营业额 (sales),那怎么 ...
- 关于SQL的Group By
SELECT col1, col2, col3, sum(col3) from T1 GROUP BY col1, col2, col3, col4 ; 对于含有Group By的Sql语句,需要注意 ...
- SQL GROUP BY 语句
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...
- SQL之GROUP BY 语句
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...
- SQL-W3School-函数:SQL GROUP BY 语句
ylbtech-SQL-W3School-函数:SQL GROUP BY 语句 1.返回顶部 1. 合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROU ...
随机推荐
- 《第一行代码》学习笔记9-活动Activity(7)
1.发现Android中的活动是可以层叠的,每启动一个新的活动,就会覆盖在原活动之上, 然后点击Back键会销毁最上面的活动,下面的一个活动就会重新显示出来. 2.Android是使用任务来管理活动的 ...
- Silverlight Visifire控件 .net后台控制aspx页面控件的显示与隐藏,动态给控件赋值,选定默认值的设定
.net后台代码: 控件的显示与隐藏: this.dateStart.Visibility = Visibility.Collapsed;//不显示控件 this.dateYear.Visibilit ...
- oc随笔三:多态
多态使用总结: (1)没有继承就没有多态 (2)代码的体现:父类类型的指针指向子类对象 (3)好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行 ...
- 浅谈Block传值-匿名函数(代码块)
block传值是从后往前传值---代理也是 // 使用block时, 不能访问self, 也不能直接访问属性, self.属性, 用self调用方法; 只要这样做了, block都会对其强引用一份, ...
- 访问MySQL数据库时,报“找不到请求的 .net Framework 数据提供程序。可能没有安装。”的解决方案
最近开发了一个系统,在测试环境上进行部署(win7环境)并测试,没有发现问题:但是把系统部署到win Server2008R2上之后,部分页面就报“找不到请求的 .net Framework 数据提供 ...
- windows中java读目录空格变成%20 处理方法
URL url = Thread.currentThread().getContextClassLoader().getResource(""); String path = ur ...
- 练习--分治法--Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. / ...
- lunix安装jdk(rpm格式)
1.下载后,首先把jdk-7u3-linux-x64.rpm复制到/usr/local/src#cp jdk-7u3-linux-x64.rpm /usr/local/src/2.给所有用户添加可执行 ...
- NFine常见错误
1.新增数据录入录入不进去提示:An error occurred while updating the entries.See the inner exception for details. 这样 ...
- Unity3D TouchScript 插件教程一
只是个人学习小记,谈不上教程,但是为了命中搜索引擎关键词,只好装逼了:),可能对于大家来说太简单了吧,网上中文教程没搜到 ,只好自己摸索了. 插件资源下载地址:https://www.assetsto ...