2013-05-30 142 views
0

我正在使用TSQL存储过程,我需要将临时表列转换为行。目前我正在逐一使用更新表,但我认为使用pivot和unpivot可以轻松实现。SQL Server将行转换为列

数据源

Periods  Stat1  Stat2  Stat3  Stat4 
-------------------------------------------------------- 
Value1  1.011  1.012  1.013  1.014 
Value2  1.011  1.021  1.031  1.041 
Value3  1.011  2.211  1.311  1.411 

期望输出

Stats  Value1  Value2  Value3 
----------------------------------------------- 
Stat1   1.011  1.011  1.011  
Stat2   1.012  1.021  1.211 
Stat3   1.013  1.031  1.311 
Stat4   1.014  1.041  1.411 

真的很感激任何帮助?

+0

我检查了https://www.simple-talk.com/sql/t-sql-programming/switching-rows-and-columns-in-sql/它包含一些解决方案,但仍然无法匹配这个。 – LittleOne

+1

http://stackoverflow.com/questions/15662382/sql-server-exact-table-transpose – AakashM

回答

1

正如你指出这是unpivoting然后旋转数据的过程:

with statTable as 
(
select periods = 'Value1', Stat1 = 1.011, Stat2 = 1.012, Stat3 = 1.013, Stat4 = 1.014 
union all select 'Value2', 1.011, 1.021, 1.031, 1.041 
union all select 'Value3', 1.011, 2.211, 1.311, 1.411 
) 
, up as 
(
    select periods, 
    c.[Stats], 
    c.value 
    from statTable 
    cross apply 
    (
    values ('Stat1', Stat1), ('Stat2', Stat2), ('Stat3', Stat3), ('Stat4', Stat4) 
) c ([Stats], value) 
) 
select [Stats], 
    Value1, 
    Value2, 
    Value3 
from up 
pivot 
(
    sum(value) 
    for periods in (Value1, Value2, Value3) 
) p 

SQL Fiddle with demo

如果你不使用SQL Server 2008或以上,你可以使用UNPIVOT而不是CROSS APPLY:

with statTable as 
(
select periods = 'Value1', Stat1 = 1.011, Stat2 = 1.012, Stat3 = 1.013, Stat4 = 1.014 
union all select 'Value2', 1.011, 1.021, 1.031, 1.041 
union all select 'Value3', 1.011, 2.211, 1.311, 1.411 
) 
, up as 
(
    select periods, 
    up.[Stats], 
    up.value 
    from statTable 
    unpivot 
    (
    value 
    for [Stats] in (Stat1, Stat2, Stat3, Stat4) 
) up 
) 
select [Stats], 
    Value1, 
    Value2, 
    Value3 
from up 
pivot 
(
    sum(value) 
    for periods in (Value1, Value2, Value3) 
) p 

SQL Fiddle with demo

+0

谢谢伊恩。似乎这应该适用于我的问题。我会检查。 – LittleOne

+0

我正在使用SQL 2005版本和第二个为我工作。谢谢。 – LittleOne