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 学生姓名

 

效果展示:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值