分组查询

分组查询详解

以学生信息表的数据为例,分组其实就是按照一个字段或者多个字段进行“分类”。比如按照年龄分类的话,那么 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:

发表回复

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