SqlServer行列倒置示例

行列倒置是SqlServer中常用的技巧之一,不同于SqlServer2000用case拼接的方式,SqlServer2005提供pivot和unpivot关键字来实现这一技巧。

一.使用PIVOT进行行列倒置

示例数据库及测试数据
create   table  RoleCellConvertDemo(id  int ,name  varchar ( 20 ),quarter  int ,profile  int )
insert   into  RoleCellConvertDemo  values ( 1 , ' a ' , 1 , 1000 )
insert   into  RoleCellConvertDemo  values ( 1 , ' a ' , 2 , 2000 )
insert   into  RoleCellConvertDemo  values ( 1 , ' a ' , 3 , 4000 )
insert   into  RoleCellConvertDemo  values ( 1 , ' a ' , 4 , 5000 )
insert   into  RoleCellConvertDemo  values ( 2 , ' b ' , 1 , 3000 )
insert   into  RoleCellConvertDemo  values ( 2 , ' b ' , 2 , 3500 )
insert   into  RoleCellConvertDemo  values ( 2 , ' b ' , 3 , 4200 )
insert   into  RoleCellConvertDemo  values ( 2 , ' b ' , 4 , 5500 )

 表RoleCellConvertDemo中的数据如下:

SqlServer行列倒置示例_第1张图片

利用pivot将每个季度的利润转换成横向显示:

select  id 编号, [ name ]  姓名, [ 1 ]  第一季度, [ 2 ]  第二季度, [ 3 ]  第三季度, [ 4 ]  第四季度
from  RowCellConvertDemo
pivot
(
sum (profile)  for  quarter  in ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
)
as  pvt

 结果:

 

 

二.使用unpivot进行反向操作

示例数据库及测试数据
create   table  CellRowConvertDemo(id  int ,name  varchar ( 50 ),Q1  int ,Q2  int ,Q3  int ,Q4  int )
insert   into  CellRowConvertDemo  values ( 1 , ' a ' , 1000 , 2000 , 4000 , 5000 )
insert   into  CellRowConvertDemo  values ( 2 , ' b ' , 3000 , 3500 , 4200 , 5500 )

CellRowConvertDemo数据:

利用unpivot进行反向操作

select  id, [ name ] ,quarter,profile
from  CellRowConvertDemo
unpivot
(
profile 
for  quarter  in ( [ Q1 ] , [ Q2 ] , [ Q3 ] , [ Q4 ] )
)
as  unpvt

结果:

SqlServer行列倒置示例_第2张图片

你可能感兴趣的:(sqlserver)