为了得到结果,你必须首先unpivot的的High
,Low
和Avg
将这些列转换成行。然后,您将应用数据透视表函数将month
值转换为列。 (请参阅:MSDN文档PIVOT/UNPIVOT)
由于您使用的SQL Server 2008+,你可以使用CROSS APPLY
和VALUES
到UNPIVOT。不透明代码是:
select t.month,
c.col,
c.value
from yourtable t
cross apply
(
values ('High', high), ('Low', Low), ('Avg', Avg)
) c (col, value)
请参阅SQL Fiddle with Demo。这给出结果的格式,然后可以通过一个月摆动:
| MONTH | COL | VALUE |
------------------------
| Jan | High | 10 |
| Jan | Low | 9 |
| Jan | Avg | 9.5 |
| Feb | High | 8 |
| Feb | Low | 7 |
一旦数据行,你申请的旋转功能,因此代码将是:
select col, Jan, Feb, Mar
from
(
select t.month,
c.col,
c.value
from yourtable t
cross apply
(
values ('High', high), ('Low', Low), ('Avg', Avg)
) c (col, value)
) d
pivot
(
sum(value)
for month in (Jan, Feb, Mar)
) piv
见SQL Fiddle with Demo 。这给出结果:
| COL | JAN | FEB | MAR |
--------------------------
| Avg | 9.5 | 7.5 | 6.5 |
| High | 10 | 8 | 7 |
| Low | 9 | 7 | 6 |
既然你旋转月份的名字,我怀疑你需要这样一个动态的SQL版本,但如果你有一个未知的数值,那么你就可以使用动态SQL得到的结果。
请在网站上搜索PIVOT/UNPIVOT示例。这个问题每天至少要问5次。 – 2013-03-27 15:19:47