Group By子句可以将表的行划分为不同的组。分别总结每个组,这样就可以控制想要看见的详细信息的级别。
语法:
[ Group By [ ALL ] Group_By_expression[ ,...n ]
[ WITH { CUBE | ROLLUP } ] ]
参数说明:
ALL:包含所有组和结果集,甚至包含那些任何行都不满足WHERE子句指定的搜索条件的组和结果集。如果指定了ALL,将对组中不满足搜索条件的汇总列返回空值。不能用CUBE或ROLLUP运算符指定ALL。如果访问远程表的查询中有WHERE子句,则不支持Group By ALL *** 作。
Group_By_expression:对其执行分组的表达式。Group_By_expression也称为分组列。Group_By_expression可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。对于不包含CUBE或ROLLUP的Group By子句,Group_By_ expression的项数受查询所涉及的Group By列的大小、聚合列和聚合值的限制。该限制从8060字节的限制开始,对保存中间查询结果所需的中间级工作表有8060字节的限制。如果指定了CUBE或ROLLUP,则最多只能有10个分组表达式。
CUBE:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的Group By汇总行。Group By汇总行在结果中显示为NULL,但可用来表示所有值。使用GroupING函数确定结果集内的空值是否是Group By汇总值。结果集内的汇总行数取决于Group By子句内包含的列数。Group By子句中的每个 *** 作数(列)绑定在分组NULL下,并且分组适用于所有其他 *** 作数(列)。由于CUBE返回每个可能的组和子组组合,因此,不论指定分组列所使用的是什么顺序,行数都相同。
ROLLUP:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。
使用Group By子句的注意事项。
(1)在SELECT子句的字段列表中,除了聚集函数外,其他所出现的字段一定要在Group By子句中有定义才行。例如“Group By A,B”,那么“SELECT SUM(A),C”就有问题,因为C不在Group By中,但是SUM(A)是可以的。
(2)SELECT子句的字段列表中不一定要有聚集函数,但至少要用到Group By子句列表中的一个项目。例如“Group By A,B,C”,则“SELECT A”是可以的。
(3)在SQL Server中text、ntext和image数据类型的字段不能作为Group By子句的分组依据。
(4)Group By子句不能使用字段别名。
1.按单列进行分组
Group By子句可以基于指定某一列的值将数据集合划分为多个分组,同一组内所有记录在分组属性上具有相同值。
示例:
把“student”表按照“性别”这个单列进行分组。在查询分析器中输入的SQL语句如下:
use student
select 性别
from student
Group By 性别
但仍然要强调SELECT子句必须与Group By后的子句或者是分组函数列相一致。
例如,由于下列查询中“姓名”列既不包含在Group By子句中,也不包含在分组函数中,所以是错误的。错误的SQL语句如下:
use student select 姓名,性别 from student Group By 性别
例如,在“grade”表中,按“学期”分组查询。SQL语句如下:
use studnet select 学期 from grade Group By 学期
2.按多列进行分组
Group By子句可以基于指定多列的值将数据集合划分为多个分组。
示例:
在“student”表中,按照“性别”和“年龄”列进行分组。在查询分析中输入的SQL语句如下:
use student
select 性别,年龄
from student
Group By 性别,年龄
在“student”表中,首先按照“性别”分组,然后再按照“年龄”分组。
再举一个例子,例如,在“grade”表中,按照“学号”和“课程代号”列进行分组。SQL语句如下:
use student
select 学号,课程代号 from grade Group By 学号,课程代号
按多列进行分组时有NULL组的是如何处理的。当表按多列进行分组时有NULL组,这时NULL被作为一个特定值处理,就像其他任何值一样。也就是说,如果在某个分组列中存在两个NULL,则按它们有相同的值那样处理,并将它们放在相同的组中。
示例:
在“grade”表中,按“学期”和“课程代号”列进行分组。在查询分析器中输入的SQL语句如下:
use student
select 学期,课程代号
from grade
Group By 学期,课程代号
3.与聚集函数一起使用
Group By子句是经常与聚集函数一起使用。如果SELECT子句中包含聚集函数,则计算每组的汇总值,当用户指定Group By时,选择列表中任一非聚集表达式内的所有列都应包含在Group By列表中,或者Group By表达式必须与选择列表表达式完全匹配。
示例:
在“student”表中,分别求男女生的平均年龄。在查询分析器中输入的SQL语句如下:
use student
select 性别,avg(年龄) as 平均年龄
from student
Group By 性别
例如,在“student”表中,分别求有多少个男生和女生。SQL语句如下:
use student
select 性别,count(性别) as 人数 from student Group By 性别
说明:关于聚合函数的详细讲解可参阅9.2.1节。
4.与HAVING子句一起使用
HAVING子句对Group By子句选择出来的结果进行再次筛选,最后输出符合HAVING子句中条件的记录。HAVING子句的语法与WHERE子句的语法相类似,惟一不同的是HAVING子句中可以包含聚合函数。
语法:
[HAVING <search_condition>]
参数说明:
<search_condition>:指定组或聚合应满足的搜索条件。当HAVING与Group By ALL一起使用时,HAVING 子句替代ALL。
示例:
在“student”表中,按“性别”分组求平均年龄,并且查询其平均年龄大于21的学生信息。在查询分析器中输入的SQL语句如下:
use student
select avg(年龄), 性别
from student
Group By 性别
having avg(年龄)>21
在“grade”表中,按“学期”分组求平均成绩,并且查询“平均成绩”大于93的课程信息。在查询分析器中输入的SQL语句如下:
+1 已赞过
Finereport中有一个自定义分组-分组报表可以解决这个需求:
1. 问题描述
通常情况下,数据是通过某一字段来进行分组,如日期字段,每个日期对应一个组,此时分组过于详细,希望按照年与周来分组显示。如下图:
数据库中存的是年月日格式的日期,如何按照年与周来进行分组呢?
2. 示例
2.1 新建报表,添加数据集
新建工作薄,添加数据集ds1,SQL语句为SELECT * FROM 订单。
2.2 表样设计
如下图制作报表,将字段拖拽至对应单元格,运货费数据设置为汇总>求和:
2.3 自定义公式分组
订购日期按“年”分组
选择A2单元格中的订购日期数据列,数据设置修改为分组>高级,点击后面的自定义按钮,d出自定义分组对话框,选择公式分组。
让该订购日期字段按照“年”来分组,如下图:
订购日期按“周”分组
选择B2单元格的订购日期数据列,数据设置修改为分组>高级,点击后面的自定义按钮,d出自定义分组对话框,选择公式分组。
让该订购日期字段按照“周”来分组,如下图:
3. 保存并预览
保存模板,最终效果如上图。
需要用group by语句来统计。
1、创建测试表、插入数据:
create table test(id int,
name varchar(10),
score int,
classname varchar(20))
insert into test values (1,'张三',100,'一班')
insert into test values (2,'李四',89,'一班')
insert into test values (3,'王五',97,'一班')
insert into test values (4,'赵六',87,'二班')
insert into test values (5,'孙七',94,'二班')
insert into test values (6,'杨八',76,'二班')
2、查询每个班级的总分,可用如下语句:
select classname,SUM(score) as 总分 from test group by classname3、结果截图:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)