测试数据:
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 学生姓名
效果展示:
最后:通常复杂的数据,保存的时候是纵向保存,分析的时候是横向分析