【数据库】sql sum(case when else end)【xml PATH 】 。。。group by。。。实现行转列

测试数据:

USE [db_sql20001]
GO
/****** Object:  Table [dbo].[tb_StuScore10]    Script Date: 01/30/2019 20:59:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tb_StuScore10](
	[学生姓名] [varchar](20) NULL,
	[学生学科] [varchar](20) NULL,
	[成绩] [float] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[tb_StuScore10] ([学生姓名], [学生学科], [成绩]) VALUES (N'张红', N'语文', 80)
INSERT [dbo].[tb_StuScore10] ([学生姓名], [学生学科], [成绩]) VALUES (N'张红', N'数学', 90)
INSERT [dbo].[tb_StuScore10] ([学生姓名], [学生学科], [成绩]) VALUES (N'张红', N'外语', 85)
INSERT [dbo].[tb_StuScore10] ([学生姓名], [学生学科], [成绩]) VALUES (N'李燕', N'语文', 80)
INSERT [dbo].[tb_StuScore10] ([学生姓名], [学生学科], [成绩]) VALUES (N'李燕', N'数学', 85)
INSERT [dbo].[tb_StuScore10] ([学生姓名], [学生学科], [成绩]) VALUES (N'李燕', N'外语', 92)

--行转列前:

SELECT
    学生姓名,
    学生学科,
    成绩
FROM tb_StuScore10

--在学生成绩信息表中tb_StuScore10实现行转列,其中sum(case when 统计 类型为数据型的字段);而xml path是合并类型为字符串的字段,并且可以同时合并多个字段的。
 



SELECT
	学生姓名,
	(SELECT
		学生学科 + ';'
	FROM tb_StuScore10
	WHERE 学生姓名 = A.学生姓名 AND 学生学科 = '语文'
	FOR xml PATH (''))
	AS 语文,
	SUM(CASE
		WHEN 学生学科 = '语文' THEN 成绩 ELSE NULL
	END) 语文成绩,
	(SELECT
		学生学科 + ';'
	FROM tb_StuScore10
	WHERE 学生姓名 = A.学生姓名 AND 学生学科 = '数学'
	FOR xml PATH (''))
	AS 数学,
	SUM(CASE
		WHEN 学生学科 = '数学' THEN 成绩 ELSE NULL
	END) 数学成绩,
	(SELECT
		学生学科 + ';'
	FROM tb_StuScore10
	WHERE 学生姓名 = A.学生姓名 AND 学生学科 = '外语'
	FOR xml PATH (''))
	AS 英语,
	SUM(CASE
		WHEN 学生学科 = '外语' THEN 成绩 ELSE NULL
	END) 外语成绩

FROM tb_StuScore10 A
GROUP BY 学生姓名

 

效果展示:

最后:通常复杂的数据,保存的时候是纵向保存,分析的时候是横向分析

展开阅读全文

没有更多推荐了,返回首页