2016-08-03 71 views
1

我有一个非常宽的表格。我想要做的就是将行的每个值放入一个列中。我也不能硬编码列名,因为在许多不同的表上执行此操作。所以,它必须是动态的。最后,请假定表中只有一行。Unpivot all values into a column

有没有一种简单的方法来UNPIVOT表中的每个值?

当前

Col_A Col_B Col_C Col_D 
    a  b  c  d 

所需的结果

Col_Index Col_Value 
    1   a 
    2   b 
    3   c 
    4   d 

逆转置的传统例子是没有帮助的,因为我需要unpivoting每一行/列的简单,动态,方式。 Unpivot适用于一个或多个,而不是全部。

+1

重复http://stackoverflow.com/questions/18026236/sql-server-columns-to-rows – iamdave

+0

请参阅[this](https://technet.microsoft.com /en-us/library/ms177410%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396) – techspider

+0

这些都没有帮助。我没有试图去发现一个价值。我正在努力去发掘每一个价值。 –

回答

1

这应该得到的序号位置作为COL_INDEX和转换领域Col_Value动态

DECLARE @sql NVARCHAR(MAX), 
     @columns NVARCHAR(Max), 
     @ordinals NVARCHAR(Max), 
     @table VARCHAR(200) = 'table' 



SELECT @columns = STUFF ((SELECT ',CAST(' + QUOTENAME(column_name) + ' AS VARCHAR(MAX)) AS ' + QUOTENAME(ORDINAL_POSITION) 
          FROM  information_schema.columns 
          WHERE  [email protected] 
          ORDER BY ORDINAL_POSITION FOR XML PATH('')), 1, 1, ''), 
     @ordinals = STUFF ((SELECT ',' + QUOTENAME(ORDINAL_POSITION) 
          FROM  information_schema.columns 
          WHERE  [email protected] 
          ORDER BY ORDINAL_POSITION FOR XML PATH('')), 1, 1, '') 

SET @sql = N' 
    SELECT Col_Index, 
      Col_Value 
    FROM (SELECT ' + @columns + ' FROM ' + @table + ') t 
    UNPIVOT (
     Col_Value 
     FOR Col_Index in (' + @ordinals + ') 
    ) up 
' 

,如果你有多个模式,您将需要定义与表名一起,和前置一个到您的选择查询中的表名

+0

你是SQL上帝,我崇拜你 –

0
select a1.*,ROW_NUMBER() over (order by (select null)) as col_index from #t t 
cross apply 
(
values(col_a), 
     (col_b), 
     (col_c), 
     (col_d) 
)a1(val) 
相关问题