2016-08-03 11 views
1

私は本当に広いテーブルを持っています。私がしたいのは、行の各値を1つの列に入れることだけです。また、この操作をいくつかの異なるテーブルで実行すると列名をハードコードすることはできません。だから、それは動的でなければならない。最後に、テーブルに1つの行しかないと仮定してください。すべての値を列にピボットしないでください

テーブル内のすべての値を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 

伝統的な例としては有用ではありません。ピボット解除は、すべてではなく、1つまたは複数に適用されます。

+1

重複したhttp://stackoverflow.com/questions/18026236/sql-server-columns-torows – iamdave

+0

[this](https://technet.microsoft.com)を参照してください。 /en-us/library/ms177410%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396) – techspider

+0

どちらも参考になりません。私は1つの価値をunpivotしようとしていない。私はすべての価値をunpivotしようとしています。 –

答えて

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) 
関連する問題