T-SQL的高级查询详解--分组查询
2010-05-02 19:18
232 查看
分组查询主要是指Group By[/b]字句将行划分成较小的组,然后使用聚合函数返回每一组的汇总信息。分组查询一般是用来满足统计需求的。[/b]
1. [/b]使用Group By[/b]进行分组查询[/b]
[/b] 为了说明分组查询来看以学生成绩表的例子,成绩表中存储了所有课程的成绩。在这种情况下,可能就需要不同课程的平均成绩,也就是说,需要对不同的成绩首先按照课程进行分组,分组以后再进行聚合计算,得到累计信息。
假设学员成绩表中有以下数据:
此时,要统计不同课程的平均分数,首先把相同的CourseID都分为一组,然后把这些相同对应的分数值在使用前面的聚合函数取平均值,如图所示:
以上这种类型的查询,在SQL server中叫做分组查询,分组查询采用Group By子句来实现。
采用分组查询的SQL语句如下:
Select CourseID, Avg(Score) as 课程平均成绩
From Score
Group By CourseID
查询结果如图:
分组查询有时候可能还要按照多个列进行分组。例如,成绩表中记录了每门课程内部测试的成绩。内部测试如果不及格还需要补考,补考学生最后的成绩取第一次成绩和补考成绩的平均值,如下图所示:
如果要统计内部测试的成绩表,则学生的编号、内部测试的课程编号不能存在重复,两项都重复的行的分数值要去平均值。因此,这是一个既按照学生编号又按照内部测试课程编号进行分组的查询。
SQL语句如下:
Select StudentID as 学员编号,CourseID as 内部测试, Avg(Score) as 内部测试平均成绩
From Score
Group By StudentID,CourseID
查询输出的结果如下图:
要使用Group By关键字时,在select列表中可以指定的项目是有限的,select语句中仅允许以下几项。
被分组的列
为每个组返回一个值的表达式
2.[/b]使用Having[/b]子句进行分组筛选[/b]
案例需求:接上面的案例,如果查询内部测试的成绩,只显示“补考过的学员”的成绩怎么处理 ?
这个时候,牵涉到分组统计后的条件限制。限制条件为Count(score)>1必须要使用Having子句
满足以上要求的SQL语句如下:
Select StudentID as 学员编号,CourseID as 内部测试,
Avg(Score) as 内部测试平均成绩
From Score
Group By StudentID,CourseID
Having Count(Score)>1
查询结果如图:
3.分组查询—对比[/b]
WHERE子句从数据源中去掉不符合其搜索条件的数据
GROUP BY子句搜集数据行到各个组中,统计函数为各个组计算统计值
HAVING子句去掉不符合其组搜索条件的各组数据行
下面继续通过案例的形式讲解分组查询的具体应用过程。
案例需求1: 在按照部门分类的员工表中,要查询“有多个员工的工资不低于2000 的部门编号”
Select 部门编号, Count(*)
From 员工信息表
Where 工资 >= 2000
GROUP BY 部门编号
Having Count(*) > 1
案例需求2: 查询08年2月到7月的客户账单合计费用
Select CAST (DATEPART(YEAR,paytime) as varchar(10))+'年'+ CAST (DATEPART(MONTH,paytime) as varchar(10))+'月' AS 日期,Sum(CHARGE) 合计费用
From "history-accountbill“ Where isPaid<>0 AND
paytime between '2008-02-01 00:00:00' and '2008-7-31 23:59:59'
Group By CAST (DATEPART(YEAR,paytime) as varchar(10))+'年'+ CAST (DATEPART(MONTH,paytime) as Varchar(10))+'月'
本文出自 “乐成的技术笔记” 博客,请务必保留此出处http://yueyuanyuan.blog.51cto.com/1342062/308496
1. [/b]使用Group By[/b]进行分组查询[/b]
[/b] 为了说明分组查询来看以学生成绩表的例子,成绩表中存储了所有课程的成绩。在这种情况下,可能就需要不同课程的平均成绩,也就是说,需要对不同的成绩首先按照课程进行分组,分组以后再进行聚合计算,得到累计信息。
假设学员成绩表中有以下数据:
此时,要统计不同课程的平均分数,首先把相同的CourseID都分为一组,然后把这些相同对应的分数值在使用前面的聚合函数取平均值,如图所示:
以上这种类型的查询,在SQL server中叫做分组查询,分组查询采用Group By子句来实现。
采用分组查询的SQL语句如下:
Select CourseID, Avg(Score) as 课程平均成绩
From Score
Group By CourseID
查询结果如图:
分组查询有时候可能还要按照多个列进行分组。例如,成绩表中记录了每门课程内部测试的成绩。内部测试如果不及格还需要补考,补考学生最后的成绩取第一次成绩和补考成绩的平均值,如下图所示:
如果要统计内部测试的成绩表,则学生的编号、内部测试的课程编号不能存在重复,两项都重复的行的分数值要去平均值。因此,这是一个既按照学生编号又按照内部测试课程编号进行分组的查询。
SQL语句如下:
Select StudentID as 学员编号,CourseID as 内部测试, Avg(Score) as 内部测试平均成绩
From Score
Group By StudentID,CourseID
查询输出的结果如下图:
要使用Group By关键字时,在select列表中可以指定的项目是有限的,select语句中仅允许以下几项。
被分组的列
为每个组返回一个值的表达式
2.[/b]使用Having[/b]子句进行分组筛选[/b]
案例需求:接上面的案例,如果查询内部测试的成绩,只显示“补考过的学员”的成绩怎么处理 ?
这个时候,牵涉到分组统计后的条件限制。限制条件为Count(score)>1必须要使用Having子句
满足以上要求的SQL语句如下:
Select StudentID as 学员编号,CourseID as 内部测试,
Avg(Score) as 内部测试平均成绩
From Score
Group By StudentID,CourseID
Having Count(Score)>1
查询结果如图:
3.分组查询—对比[/b]
WHERE子句从数据源中去掉不符合其搜索条件的数据
GROUP BY子句搜集数据行到各个组中,统计函数为各个组计算统计值
HAVING子句去掉不符合其组搜索条件的各组数据行
下面继续通过案例的形式讲解分组查询的具体应用过程。
案例需求1: 在按照部门分类的员工表中,要查询“有多个员工的工资不低于2000 的部门编号”
Select 部门编号, Count(*)
From 员工信息表
Where 工资 >= 2000
GROUP BY 部门编号
Having Count(*) > 1
案例需求2: 查询08年2月到7月的客户账单合计费用
Select CAST (DATEPART(YEAR,paytime) as varchar(10))+'年'+ CAST (DATEPART(MONTH,paytime) as varchar(10))+'月' AS 日期,Sum(CHARGE) 合计费用
From "history-accountbill“ Where isPaid<>0 AND
paytime between '2008-02-01 00:00:00' and '2008-7-31 23:59:59'
Group By CAST (DATEPART(YEAR,paytime) as varchar(10))+'年'+ CAST (DATEPART(MONTH,paytime) as Varchar(10))+'月'
本文出自 “乐成的技术笔记” 博客,请务必保留此出处http://yueyuanyuan.blog.51cto.com/1342062/308496
相关文章推荐
- T-SQL的高级查询详解--分组查询
- 高级sql学习——null详解,字符格式详解,随机值查询!!!
- T-SQL的高级查询详解--聚合函数
- Oracle数据库之SQL(高级查询)详解
- T-SQL的高级查询详解(一)
- T-SQL的高级查询详解(一)--函数的综合应用
- sql笔记五:高级查询及通配符、排序分组
- oracle 基础SQL语句 多表查询 子查询 分页查询 合并查询 分组查询 group by having order by
- SQL--分组查询
- 根据时间或时间戳分组统计查询SQL记录
- T-SQL查询进阶--详解公用表表达式(CTE)
- T-SQL查询——详解公用表达式(CTE)
- sql 多个字段分组查询语句
- sqlserver中分组查询,条件过滤,排序,写这个sql,我为自己感到骄傲
- SQL高级查询
- SQL查询系列之七:SQL分组查询
- 第7讲 SQL复杂查询---聚集函数以及分组过滤
- SQL中分组函数的使用及前N条记录的查询方法
- SQL高级语句-CREATE INDEX 在表中创建索引,以便更加快速高效地查询数据。
- SQL分组查询