前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL教程:行转列

SQL教程:行转列

作者头像
SQL数据库开发
发布2024-05-10 18:31:56
620
发布2024-05-10 18:31:56
举报
文章被收录于专栏:SQL数据库开发SQL数据库开发

SQL刷题专栏

SQL145题系列

CASE函数的类型

CASE具有两种格式,简单CASE函数和CASE搜索函数。这两种方式,大部分情况下可以实现相同的功能。

简单CASE函数

语法

CASE column WHENTHEN value WHENTHEN value ...... ELSE value END

示例

代码语言:javascript
复制
CASE sex
     WHEN '1' THEN '男'
     WHEN '2' THEN '女'
ELSE '其他' END

CASE搜索函数

语法

CASE WHEN[,] THEN value WHEN[,] THEN value ...... ELSE value END

示例

代码语言:javascript
复制
CASE WHEN sex = '1' THEN '男'
     WHEN sex = '2' THEN '女'
ELSE '其他' END

简单CASE 函数重在简洁,但是它只适用于这种单字段的单值比较,而CASE 搜索函数的优点在于适用于所有比较(包括多值比较)的情况。

例如

代码语言:javascript
复制
CASE WHEN sex = '1' AND age>18 THEN '成年男性'
     WHEN sex = '2' AND age>18 THEN '成年女性'
ELSE '其他' END

注意:CASE函数只返回第一个符合条件的值,剩下的CASE部分将会被自动忽略。比如说,下面这段SQL,你永远无法得到“第二类”这个结果

代码语言:javascript
复制
CASE WHEN Type IN ('a','b') THEN '第一类'
     WHEN Type IN ('a')     THEN '第二类'
ELSE '其他类' END

行转列

CASE用的比较广泛的功能就是行转列,就是将记录行里的数据按条件转换成具体的列。看如下的一个示例:

代码语言:javascript
复制
IF OBJECT_ID('Score') IS NOT NULL DROP TABLE Score
GO
CREATE TABLE Score(姓名 NVARCHAR(10),课程 NVARCHAR(10),分数 INT)
INSERT INTO Score VALUES (N'张三',N'语文',74)
INSERT INTO Score VALUES (N'张三',N'数学',83)
INSERT INTO Score VALUES (N'张三',N'物理',93)
INSERT INTO Score VALUES (N'李四',N'语文',74)
INSERT INTO Score VALUES (N'李四',N'数学',84)
INSERT INTO Score VALUES (N'李四',N'物理',94)
GO
SELECT * FROM Score
GO

执行完成后的结果如图:

现在我们想实现这样的功能,就是将各学科作为单独的列来显示各个学生各科的成绩。我们可以对课程里的记录做如下的行列转换:

代码语言:javascript
复制
SELECT 姓名,
MAX(CASE 课程 WHEN N'语文' THEN 分数 ELSE 0 END) 语文,
MAX(CASE 课程 WHEN N'数学' THEN 分数 ELSE 0 END) 数学,
MAX(CASE 课程 WHEN N'物理' THEN 分数 ELSE 0 END) 物理
FROM Score
GROUP BY 姓名

执行结果如下:

行转列新方法

这样就很好的完成了行列的转换了,当然这只是一个比较简单的例子,SQL Server 2005版之后有单独的行列转换功能PIOVT,以下查询同样可以得到上面的结果:

代码语言:javascript
复制
SELECT * FROM Score
PIVOT( MAX(分数) FOR 课程 IN (语文,数学,物理)) A
  • 其中FOR后面的是我们即将进行行转列的列部分
  • IN里面的是我们行转列之后的列
  • MAX是聚合IN里面的内容,也可以是其他聚合函数:SUM,MIN,COUNT等
  • PIVOT写法比较固定,是CASE WHEN的一种简略写法。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL数据库开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档