SQL2005行转列

SQL SERVER 2005中新增加了两个关系运算符 PIVOT/ UNPIVOT,能够实现表中的列转换到行,以及行到列的转换工作。

举例,还是先创建测试数据表

SQL2005行转列CREATE TABLE sales.salesByMonth
SQL2005行转列(
SQL2005行转列
year char(4),
SQL2005行转列
month char(3),
SQL2005行转列amount 
money,
SQL2005行转列
PRIMARY KEY (yearmonth)
SQL2005行转列)
SQL2005行转列
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Jan'789.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Feb'389.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Mar'8867.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Apr'778.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','May'78.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Jun'9.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Jul'987.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Aug'866.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Sep'7787.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Oct'85576.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Nov'855.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2004','Dec'5878.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2005','Jan'7.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2005','Feb'6868.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2005','Mar'688.0000)
SQL2005行转列
INSERT INTO sales.salesByMonth (yearmonth, amount)
SQL2005行转列
VALUES('2005','Apr'9897.0000)

我们想要得到类似这样的结果:
Year  Jan            Feb             Mar       ..............
----- ---------- ----------- -----------
2004 789.0000 389.0000     8867.0000 .............
2005 7.0000     6868.0000   688.0000 ..............

上一篇文章介绍的方法当然可以实现,但现在这里想要的列是固定的,不是动态的,就是12个月,所以也可以这样子来用:
SQL2005行转列SELECT year,
SQL2005行转列
SUM(case when month = 'Jan' then amount else 0 endAS 'Jan',
SQL2005行转列
SUM(case when month = 'Feb' then amount else 0 endAS 'Feb',
SQL2005行转列
SUM(case when month = 'Mar' then amount else 0 endAS 'Mar',
SQL2005行转列
SUM(case when month = 'Apr' then amount else 0 endAS 'Apr',
SQL2005行转列
SUM(case when month = 'May' then amount else 0 endAS 'May',
SQL2005行转列
SUM(case when month = 'Jun' then amount else 0 endAS 'Jun',
SQL2005行转列
SUM(case when month = 'Jul' then amount else 0 endAS 'Jul',
SQL2005行转列
SUM(case when month = 'Aug' then amount else 0 endAS 'Aug',
SQL2005行转列
SUM(case when month = 'Sep' then amount else 0 endAS 'Sep',
SQL2005行转列
SUM(case when month = 'Oct' then amount else 0 endAS 'Oct',
SQL2005行转列
SUM(case when month = 'Nov' then amount else 0 endAS 'Nov',
SQL2005行转列
SUM(case when month = 'Dec' then amount else 0 endAS 'Dec'
SQL2005行转列
FROM sales.salesByMonth
SQL2005行转列
GROUP by year


但这样事实上还是相当麻烦的,现在SQLSERVER2005中有更方便的实现方法。
SQL2005行转列SELECT Year,[Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec]
SQL2005行转列
FROM (
SQL2005行转列  
SELECT year, amount, month
SQL2005行转列  
FROM sales.salesByMonth ) AS salesByMonth
SQL2005行转列PIVOT ( 
SUM(amount) FOR month IN
SQL2005行转列  (
[Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec])
SQL2005行转列  ) 
AS ourPivot
SQL2005行转列
ORDER BY Year

就是这样,很简单的用法,效果是完全一样的。

我们再尝试一下把year去掉:
SQL2005行转列SELECT [Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec]
SQL2005行转列
FROM ( SELECT amount, month
SQL2005行转列
FROM sales.salesByMonth ) AS salesByMonth
SQL2005行转列PIVOT ( 
SUM(amount) FOR month IN
SQL2005行转列(
[Jan],[Feb],[Mar],[Apr],[May],[Jun],[Jul],[Aug],[Sep],[Oct],[Nov],[Dec])
SQL2005行转列
AS ourPivot


得到的结果是:
Jan                 Feb                 Mar             ...
---------- ------------ -----------
796.0000     7257.0000     9555.0000     ...

同一个月份的数据累加到一起。


再给个微软官方的例子:
SQL2005行转列

 

 

本文转自温景良(Jason)博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2009/12/09/1619897.html,如需转载请自行联系原作者

上一篇:DNS原因导致的不能访问网站问题一例


下一篇:SAP Commerce Cloud启动时遇到的9001端口被占用的问题