分组查询详解
以学生信息表的数据为例,分组其实就是按照一个字段或者多个字段进行“分类”。比如按照年龄分类的话,那么 20 岁的一组,21 岁的一组。比如我这里按照学号进行分组(分类)。
但是分类后,就只能输出分组的那几个标记。这个也比较好理解。比如你对全班同学进行分组,分组的依据是年龄,那么分组后只能输出年龄字段,因为其他字段每一组里面都可能不止一个,所以不能输出。所以如果想办法把其他的字段合并成一个的话,就可以输出,比如使用统计函数,统计后的结果是一个值,那这就可以输出。
这里 SQL Server 尝试输出成绩编号,但是成绩编号不是分类的字段,所以就报错。所以只能输出分类的字段,比如学生编号:
select c.学生编号 from [dbo].[成绩信息] as c
group by c.学生编号Code language: JavaScript (javascript)
那么我想输出学生分数呢?就是遇到我们刚才的问题,尝试把多个值输出到一个里面。因为分组后每一组的分数不止一个,SQL Server 无法输出。那怎么办呢?通过统计函数把多个变成一个。
select
c.学生编号,
Sum(c.分数) as 总分数,
Stuff(
(
SELECT ','+ Convert(nvarchar(30),分数)
FROM [dbo].[成绩信息] c2
WHERE c2.学生编号 = c.学生编号
FOR XML PATH('')
)
,1
,1
,'') as 分数情况
from [dbo].[成绩信息] as c
group by c.学生编号Code language: JavaScript (javascript)
select * from [dbo].[成绩信息] FOR XML PATH('')Code language: JavaScript (javascript)
分组可以按照多个字段进行分组,比如按照学号和文理科分组:
SELECT c.学生编号,c.课程编号,COUNT(1) as 数量
FROM [学生成绩管理系统].[dbo].[成绩信息] as c
group by c.学生编号,c.课程编号Code language: CSS (css)
SELECT c.学生编号,COUNT(1) as 数量,--c.分数,
(
SELECT ','+convert(nvarchar(10),[分数])
FROM [学生成绩管理系统].[dbo].[成绩信息] c2
where c2.学生编号 = c.学生编号
for xml path('')
) as 分数情况
FROM [学生成绩管理系统].[dbo].[成绩信息] as c
group by c.学生编号Code language: JavaScript (javascript)
Previous: LEN 函数
Next: FOR XML PATH