每隔一列转置或取消转换

时间:2012-11-27 19:43:45

标签: sql tsql unpivot

基本上我要做的是将每隔一列转置到一行,旁边有以下列数据。

源只能有两列,最多可达一千和几百万行。我只是按行进行此操作。我尝试过做一个“UNION ALL”,但是当处理大型表中的数百列时,这个速度非常慢。

可能的解决方案是使用UNPIVOT,尽管我能找到的每个例子都在做一些与我想要的不同的事情。

示例:查询前

Columns...
Apple | Apple Data | Banana | Banana  Data | Cranberry | Cranberry  Data | .... 

Data Returned... 
IOWA_PL_RLA | 1 | IOWA_PL_MATH | 1 | IOWA_SS_RLA 684 .....

示例:查询后

MeasureID  Score
CRCT_PL_RLA   | 1 
CRCT_PL_MATH  | 1 
CRCT_SS_RLA   |684 
.....

希望我已经足够解释,有人可以提供帮助,因为我只是在T-SQL中经验丰富。如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:11)

如果您使用的是SQL Server 2008,我认为您应该考虑使用CROSS APPLY(VALUES)技术:

http://www.sqlservercentral.com/articles/CROSS+APPLY+VALUES+UNPIVOT/91234/

基本上,它是这样的:

SELECT
  x.NewColumn1,
  x.NewColumn2
FROM YourTable t
CROSS APPLY (
    VALUES
        (t.OldColumn1, t.OldColumn2),
        (t.OldColumn3, t.OldColumn4),
        ...
) x (NewColumn1, NewColumn2);

这是一个可运行的示例:http://sqlfiddle.com/#!3/9a9d2/5/0