使用pivot和unpivot语句实现行转列,列转行

在做报表时,经常需要将数据表中的行转列,或者列转行,如果不知道方法,你会觉得通过SQL语句来实现非常难。这里,我将使用pivot和unpivot来实现看似复杂的功能。

引用MSDN:
可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值,但是在实际应用中,有些聚合之后的数据很难进行拆分。所以呢,unpivot并非pivot的逆过程。


pivot 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。
使用SELECT...CASE语句进行行转列的方法见:解析SQL Server中行转列问题


简单的例子如下:
---------行转列
create table test(编号 int,姓名 varchar(20),季度 int,销售额 int) 
insert into test values(1,'simon',1,1000);
insert into test values(1,'simon',2,2000);
insert into test values(1,'simon',3,3000);
insert into test values(1,'simon',4,4000);
insert into test values(2,'meme',1,5000);
insert into test values(2,'meme',2,6000);
insert into test values(2,'meme',3,7000);
insert into test values(2,'meme',4,8000);


select * from test;
select 编号,姓名,[1] as "一季度",[2] as "二季度",[3] as "三季度",[4] as "四季度",[5] as "随便1" from test pivot(sum(销售额) 
for 季度 in([1],[2],[3],[4],[5]))as pvt


--------列转行
create table test2(编号 int,姓名 varchar(20), 一季度 int, 二季度 int, 三季度 int, 四季度 int);
insert into test2 values(1,'simon',1000,2000,4000,5000);
insert into test2 values(2,'meme',3000,3500,4200,5500);


select * from test2 
select 编号,姓名,季度,销售额from test2 unpivot(销售额for 季度 in(一季度,二季度,三季度,四季度)) as unpvt


建议:如果你想了解的更加清楚,请参考:http://technet.microsoft.com/zh-cn/library/ms177410.aspx
注意:对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。如果第一种pivot不是很明白可以看看这个select 编号,姓名,[1],[2],[3],[4]
from

select * from test 
) as sourceTable
pivot
(
sum(销售额)
for 季度 in ([1],[2],[3],[4])
)as pivotTable这个是自己写的,稍稍明白一点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值