绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
SQL Server实现行转列
2022-05-31 11:09:46

工作中经常需要查询一些数据,需要写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')
复制代码

插入的数据如下:

微信图片_201912301639382019-12-30-16-51-52

3 PIVOT函数转置

执行一下查询:

SELECT * FROM dbo.Scores WITH (NOLOCK)
PIVOT(MAX(score) FOR subject IN ("Math","English","Science")) AS T
复制代码

结果如下:

微信图片_201912301639472019-12-30-16-52-4

4 总结

暂时先写到这里,原理在之后工作过程中体会,慢慢了解再更新了。

原文于:hjxlog.com/posts/20191…


作者:HuangJianxian
链接:https://juejin.cn/post/6844904037192564750

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Microsoft SQL Server
创建时间:2022-03-30 11:29:11
Microsoft SQL Server
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • itt0918
    专家
戳我,来吐槽~