SQLServer 行列转置

本文详细介绍如何使用SQL进行列转行及行转列的数据转换操作,包括CASE WHEN、PIVOT、UNION ALL和UNPIVOT等函数的运用,帮助读者掌握数据整理的关键技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列转行

数据准备
-- 建表
1> create table stuscore
2> (
3> name varchar(20),
4> subject varchar(20),
5> score int
6> );
7> go

-- 插入数据
1> insert into stuscore values ('zhangsan', 'ch', 70);
2> insert into stuscore values ('zhangsan', 'ma', 80);
3> insert into stuscore values ('zhangsan', 'en', 90);
4> insert into stuscore values ('lisi', 'ma', 60);
5> insert into stuscore values ('lisi', 'en', 50);
6> insert into stuscore values ('lisi', 'ch', 40);
7> insert into stuscore values ('wangwu', 'ma', 30);
8> insert into stuscore values ('wangwu', 'en', 20);
9> insert into stuscore values ('wangwu', 'ch', 10);
10> go

--查看数据
1> select * from stuscore;
2> go
name                 subject              score      
-------------------- -------------------- -----------
zhangsan             ch                            70
zhangsan             ma                            80
zhangsan             en                            90
lisi                 ma                            60
lisi                 en                            50
lisi                 en                            50
lisi                 ch                            40
wangwu               ma                            30
wangwu               en                            20
wangwu               ch                            10
方法一(CASE WHEN)
1> select name as 'xm',
2> max(case subject when 'ch' then score else 0 end) as 'ch',
3> max(case subject when 'en' then score else 0 end) as 'en',
4> max(case subject when 'ma' then score else 0 end) as 'ma',
5> sum(score) as 'zf',
6> avg(score) as 'pjf'
7> from stuscore
8> group by name;
9> go

结果
在这里插入图片描述

方法二(PIVOT函数)
1> select pvt.name as 'xm', pvt.ch, pvt.ma, pvt.en from stuscore 
2> pivot(max(score) for subject in (ch, en, ma)) as pvt;
3> go

结果
在这里插入图片描述

行转列

数据准备
-- 建表
1> create table score
2> (
3> name varchar(20),
4> ch int,
5> en int,
6> ma int
7> );
8> go

-- 插入数据
1> insert into score values ('zhangsan', 60, 70, 80);
2> insert into score values ('lisi', 50, 40, 30);
3> insert into score values ('wangwu', 30, 20, 10);
4> go

-- 查看数据
1> select * from score;
2> go
name                 ch          en          ma         
-------------------- ----------- ----------- -----------
zhangsan                      60          70          80
lisi                          50          40          30
wangwu                        30          20          10
方法一(UNION ALL)
1> select * from (
2> select name as 'xm', 'ch' as 'subject', ch as 'cj' from score
3> union all
4> select name as 'xm', 'ma' as 'subject', ma as 'cj' from score
5> union all
6> select name as 'xm', 'en' as 'subject', en as 'cj' from score
7> ) t
8> go

--结果
xm                   subject cj         
-------------------- ------- -----------
zhangsan             ch               60
lisi                 ch               50
wangwu               ch               30
zhangsan             ma               80
lisi                 ma               30
wangwu               ma               10
zhangsan             en               70
lisi                 en               40
wangwu               en               20
(9 rows affected)
方法二(UNPIVOT函数)
1> select * from score unpivot (score for subject in (ch, ma, en)) t
2> go

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值