Sql server SQL Server将行转换为列

Sql server SQL Server将行转换为列,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我正在处理TSQL存储过程,需要将临时表列转换为行。目前我正在使用一个接一个地更新表,但我认为使用pivot和unpivot可以很容易地实现这一点 数据源: Periods Stat1 Stat2 Stat3 Stat4 -------------------------------------------------------- Value1 1.011 1.012 1.013 1.014 Value

我正在处理TSQL存储过程,需要将临时表列转换为行。目前我正在使用一个接一个地更新表,但我认为使用pivot和unpivot可以很容易地实现这一点

数据源

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 
预期产出

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 

非常感谢您在这方面提供的帮助?

正如您所指出的,这是一个取消激励然后旋转数据的过程:

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 Server 2008或更高版本,则可以使用UNPIVOT而不是交叉应用:

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

.

我已经检查过它包含一些解决方案,但仍然无法与此匹配。谢谢伊恩。看来这应该能解决我的问题。我查一下。