2016-08-03 69 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) 
相關問題