SQL 列转行、行转列

一、行转列

create TAble TA (NAME    varchar(10) ,SUBJECT varchar(10) ,RESULT  int)
 
insert into TA(NAME , SUBJECT , RESULT) values('张三' , '语文' , 74)
insert into TA(NAME , SUBJECT , RESULT) values('张三' , '数学' , 83)
insert into TA(NAME , SUBJECT , RESULT) values('张三' , '物理' , 93)
insert into TA(NAME , SUBJECT , RESULT) values('李四' , '语文' , 74)
insert into TA(NAME , SUBJECT , RESULT) values('李四' , '数学' , 84)
insert into TA(NAME , SUBJECT , RESULT) values('李四' , '物理' , 94)
go
 
select * from TA

--方法一:使用case when end结构
select NAME 姓名,
  max(case SUBJECT when '语文' then RESULT else 0 end) 语文,
  max(case SUBJECT when '数学' then RESULT else 0 end) 数学,
  max(case SUBJECT when '物理' then RESULT else 0 end) 物理
from TA
group by NAME

--方法二:PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现
select * from TA pivot(max(RESULT) for SUBJECT in (语文,数学,物理))a



二、列转行

CREATE TABLE TB (NAME VARCHAR(20), 语文 INT, 数学 INT, 物理 INT)

INSERT INTO TB VALUES('张三', 88,99,89);
INSERT INTO TB VALUES('李四', 78,77,87);
GO

SELECT * FROM TB

--方法一:
select * from 
(select NAME,'语文' AS 科目,语文 as 分数 from TB 
 union all
 select NAME,'数学' AS 科目,数学 as 分数 from TB 
 union all
 select NAME,'物理' AS 科目,物理 as 分数 from TB
) AS t

--方法二:使用unpivot函数
SELECT NAME,科目,分数 FROM TB UNPIVOT(分数 for 科目 in (语文,数学,物理))b


转载于:https://my.oschina.net/Jacedy/blog/507070

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值