一、行转列
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