工作中经常需要查询一些数据,需要写sql语句来写报表。近就在业务中使用到了转置,现在已经不再使用case方式了,而是使用sql server内置的pivot函数来实现转置。 业务很逻辑,需要从多个表中把数据查出来,分组、排序等等,但是主要内容还是不变的,这里使用一些测试数据来测试。
1 业务场景
现在的场景是:一个学生有多门课程,每门课程都有成绩,数据库中每一行数据如下:
学号 姓名 科目 成绩
01 Huang Math 90
复制代码
多行数据的时候:
学号 姓名 科目 成绩
01 Huang Math 90
01 Huang English 90
02 Yang Math 95
02 Yang English 93
复制代码
现在的要求是要预览每个同学的各科成绩,也就是把一个学生的所有成绩压缩到一行显示,如下:
学号 姓名 Math English
01 Huang 90 90
复制代码
2 测试脚本
sql脚本如下,先去测试数据库执行一下语句。
GO
/****** Object: Table [dbo].[Scores] Script Date: 12/30/2019 2:44:21 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Scores](
[stuNo] [varchar](50) NULL,
[stuName] [varchar](50) NULL,
[subject] [varchar](50) NULL,
[score] [varchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Scores] ([stuNo], [stuName], [subject], [score]) VALUES (N'1001', N'Zhang Wei', N'Math', N'78')
INSERT [dbo].[Scores] ([stuNo], [stuName], [subject], [score]) VALUES (N'1001', N'Zhang Wei', N'English', N'81')
INSERT [dbo].[Scores] ([stuNo], [stuName], [subject], [score]) VALUES (N'1001', N'Zhang Wei', N'Science', N'90')
INSERT [dbo].[Scores] ([stuNo], [stuName], [subject], [score]) VALUES (N'1002', N'Wang Hao', N'English', N'70')
INSERT [dbo].[Scores] ([stuNo], [stuName], [subject], [score]) VALUES (N'1002', N'Wang Hao', N'Science', N'87')
INSERT [dbo].[Scores] ([stuNo], [stuName], [subject], [score]) VALUES (N'1002', N'Wang Hao', N'Math', N'76')
复制代码
插入的数据如下:
3 PIVOT函数转置
执行一下查询:
SELECT * FROM dbo.Scores WITH (NOLOCK)
PIVOT(MAX(score) FOR subject IN ("Math","English","Science")) AS T
复制代码
结果如下:
4 总结
暂时先写到这里,原理在之后工作过程中体会,慢慢了解再更新了。
作者:HuangJianxian
链接:https://juejin.cn/post/6844904037192564750