robin 发表于 2016-11-5 08:01:33

Sql Server 2005 行转列的实现(横排)

  SQL SERVER 2005中新增加了两个关系运算符 PIVOT/ UNPIVOT,能够实现表中的列转换到行,以及行到列的转换工作。   
举例,还是先创建测试数据表
  Create TABLE sales.salesByMonth 

[*]( 
[*]year char(4), 
[*]month char(3), 
[*]amount money, 
[*]PRIMARY KEY (year, month) 
[*]) 
[*]
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Jan', 789.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Feb', 389.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Mar', 8867.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Apr', 778.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','May', 78.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Jun', 9.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Jul', 987.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Aug', 866.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Sep', 7787.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Oct', 85576.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Nov', 855.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2004','Dec', 5878.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2005','Jan', 7.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2005','Feb', 6868.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2005','Mar', 688.0000) 
[*]Insert INTO sales.salesByMonth (year, month, amount) 
[*]VALUES('2005','Apr', 9897.0000) 
  我们想要得到类似这样的结果:   
Year  Jan            Feb             Mar       …………..   
—– ———- ———– ———–   
2004 789.0000 389.0000     8867.0000 ………….   
2005 7.0000     6868.0000   688.0000 …………..

[*]Select year, 
[*]SUM(case when month = 'Jan' then amount else 0 end) AS 'Jan', 
[*]SUM(case when month = 'Feb' then amount else 0 end) AS 'Feb', 
[*]SUM(case when month = 'Mar' then amount else 0 end) AS 'Mar', 
[*]SUM(case when month = 'Apr' then amount else 0 end) AS 'Apr', 
[*]SUM(case when month = 'May' then amount else 0 end) AS 'May', 
[*]SUM(case when month = 'Jun' then amount else 0 end) AS 'Jun', 
[*]SUM(case when month = 'Jul' then amount else 0 end) AS 'Jul', 
[*]SUM(case when month = 'Aug' then amount else 0 end) AS 'Aug', 
[*]SUM(case when month = 'Sep' then amount else 0 end) AS 'Sep', 
[*]SUM(case when month = 'Oct' then amount else 0 end) AS 'Oct', 
[*]SUM(case when month = 'Nov' then amount else 0 end) AS 'Nov', 
[*]SUM(case when month = 'Dec' then amount else 0 end) AS 'Dec'
[*]FROM sales.salesByMonth 
[*]GROUP by year
  
但这样事实上还是相当麻烦的,现在SQLSERVER2005中有更方便的实现方法。
  Select Year,,,,,,,,,,,, 

[*]FROM ( 
[*]Select year, amount, month
[*]FROM sales.salesByMonth ) AS salesByMonth 
[*]PIVOT ( SUM(amount) FOR month IN
[*]  (,,,,,,,,,,,) 
[*]  ) AS ourPivot 
[*]orDER BY Year
  就是这样,很简单的用法,效果是完全一样的。   
我们再尝试一下把year去掉:
  Select ,,,,,,,,,,, 

[*]FROM ( Select amount, month
[*]FROM sales.salesByMonth ) AS salesByMonth 
[*]PIVOT ( SUM(amount) FOR month IN
[*](,,,,,,,,,,,) 
[*]) AS ourPivot 
  得到的结果是:   
Jan                 Feb                 Mar             …   
———- ———— ———–   
796.0000     7257.0000     9555.0000     …   
同一个月份的数据累加到一起。   
再给个微软官方的例子:
页: [1]
查看完整版本: Sql Server 2005 行转列的实现(横排)