为了获得结果,您首先必须通过将,和列转换为行来取消旋转这些列。然后,您将应用数据透视函数将值转换为列。(参见:MSDN PIVOT/UNPIVOT文档)High
Low
Avg
month
由于您使用的是 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 来获取结果。