码迷,mamicode.com
首页 > 其他好文 > 详细

行列互转

时间:2015-07-23 14:12:09      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:pivot   unpivot   行转列   列转行   

定义:

Pivot英文意思:回转运动

PIVOT用于将列值旋转为列名(即行转列),

UNPIVOT用于将列名转为列值(即列转行),

也可以在SQL Server 2000可以用聚合函数配合CASE语句实现

语法:

PIVOTUNPIVOT的语法区别在于是否有使用聚合函数

PIVOT

table_source
PIVOT(
聚合函数(value_column)
FOR pivot_column
IN(<column_list>)
)

UNPIVOT

table_source
UNPIVOT(
value_column
FOR pivot_column
IN(<column_list>)
)

注意:

PIVOT、UNPIVOT是SQL Server 2005 的语法

实例:

一、行转列

1、建立表格

if object_id(‘test‘)is not null drop table test
go
create table test(姓名 varchar(10),课程 varchar(10),分数 int)
insert into test values(‘张三‘,‘语文‘,65)
insert into test values(‘张三‘,‘数学‘,85)
insert into test values(‘张三‘,‘英语‘,70)
insert into test values(‘李四‘,‘语文‘,80)
insert into test values(‘李四‘,‘数学‘,71)
insert into test values(‘李四‘,‘英语‘,83)
go
select * from test

姓名         课程         分数

---------- ---------- -----------

张三         语文         65

张三         数学         85

张三         英语         70

李四         语文         80

李四         数学         71

李四         英语         83

1)、通过聚合函数配合CASE语句实现

select 姓名,
 max(case 课程 when ‘语文‘ then 分数 else 0 end)语文,
 max(case 课程 when ‘数学‘ then 分数 else 0 end)数学,
 max(case 课程 when ‘英语‘ then 分数 else 0 end)英语
from test
group by 姓名

(2)、通过pivot实现:

select * from test pivot(max(分数) for 课程 in (语文,数学,英语))p

得到的结果一致:

姓名         语文          数学          英语

---------- ----------- ----------- -----------

李四         80          71          83

张三         65          85          70

 

二、列转行

1、建立表格

if object_id(‘test‘)is not null drop table test
go
create table test(姓名 varchar(10),语文 int,数学 int,英语 int)
insert into test values(‘张三‘,65,85,70)
insert into test values(‘李四‘,80,71,83)
go
select * from test

姓名         语文          数学          英语

---------- ----------- ----------- -----------

张三         65          85          70

李四         80          71          83

(1)、通过聚合函数配合CASE语句实现

select * from
(
 select 姓名,课程=‘语文‘,分数=语文 from test
 union all
 select 姓名,课程=‘数学‘,分数=数学 from test
 union all
 select 姓名,课程=‘物理‘,分数=英语 from test
) p
order by 姓名,case 课程 when ‘语文‘ then 1 when ‘数学‘ then 2 when ‘英语‘ then 3 end

姓名         课程   分数

---------- ---- -----------

李四         物理   83

李四         语文   80

李四         数学   71

张三         物理   70

张三         语文   65

张三         数学   85

(2)、通过pivot实现:

select 姓名,课程,分数 from test unpivot (分数 for 课程 in ([语文],[数学],[英语])) p

姓名         课程   分数

---------- ---- -----------

李四         物理   83

李四         语文   80

李四         数学   71

张三         物理   70

张三         语文   65

张三         数学   85


本文出自 “sukun” 博客,请务必保留此出处http://sukunwu.blog.51cto.com/10453116/1677429

行列互转

标签:pivot   unpivot   行转列   列转行   

原文地址:http://sukunwu.blog.51cto.com/10453116/1677429

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!