下面是SQL示例
drop table tb
create table tb(name varchar(10),course varchar(10),score int,sex char(4))
insert into tb values('张三','语文',74,'男')
insert into tb values('张三','语文',1,'男')
insert into tb values('张三','数学',83,'男')
insert into tb values('张三','物理',93,'男')
insert into tb values('张三','english',60,'女')
insert into tb values('李四','语文',74,'女')
insert into tb values('李四','数学',84,'女')
insert into tb values('李四','物理',94,'女')
SELECT * FROM tb
PIVOT 可以实现行转列
效果像是case when的简化语法,提供更少的信息而更多的使用语意推断,每个PIVOT 都可以使用case when等价的书写出来,使用过程中内容需要通过聚合函数转换来确定多条相同的值如何处理
--行转列
SELECT * FROM TB PIVOT(sum(score) FOR course IN (语文,数学,物理,english)) a
select name,sex,
Sum(case when course = '语文' then score end) 语文,
sum(case when course = '数学' then score end) 数学,
sum(case when course = '物理' then score end) 物理,
sum(case when course = 'english' then score end) english
from TB
group by name,sex
UNPIVOT可以实现列转行
UNPIVOT不需要聚合函数,因为转行过程中不会存在重复的情况
--列转行
SELECT * FROM
(
SELECT * FROM TB
PIVOT(sum(score) FOR course IN (语文,数学,物理)) a
)
B UNPIVOT( score for course in([语文],[数学],[物理]) ) c
sql 引用自 http://blog.sina.com.cn/s/blog_6438b0e50101r7ww.html,含有部分修改