2017-02-16 17 views
1

ソースデータの列が出力の行として表されるストアドプロシージャから結果セットとしてデータを出力する必要があります。ソースデータにある出力の各列の行が表示され、ソースデータの各行の出力に列が表示されます。私はピボットや他の方法を使ってこれをどうやって行うことができないのか分かりません。列から行へのSQLの移動

データが好きなようになったら、sys.columnsにクエリのソースデータ列名を出力の最初の列として注入すると思います。また、あらかじめ出力列名として使用されるソースデータ値を照会する必要があります。私は将来的には素晴らしい動的SQLを想像していますが、必要に応じてすべてのものを並べ替えることができます。私は主に列を行に変換する方法に関心があります。下記を参照してください。

SELECT 
    ID 
    ,XID 
    ,Amount 
FROM (
     SELECT 11 as ID, 301 as XID, 50001 as Amount UNION ALL 
     SELECT 12 as ID, 302 as XID, 50002 as Amount UNION ALL 
     SELECT 13 as ID, 303 as XID, 50003 as Amount UNION ALL 
     SELECT 14 as ID, 304 as XID, 50004 as Amount 
    ) T1 
/* 
The above query returns this: 

ID XID Amount 
---------------- 
11 301 50001 
12 302 50002 
13 303 50003 
14 304 50004 


Instead I would like to see this: 

Column 11  12  13  14 
----------------------------------- 
ID  11  12  13  14 
XID  301 302 303 304 
Amount 50001 50002 50003 50004 

*/ 
+3

チェックアウト必要がない場合はPIVOT:https://technet.microsoft.com/en- us/library/ms177410(v = sql.105).aspx – Leonidas199x

+0

これはあなたが望むものとは逆のものですが、 ldは正しい方向にあなたを誘導します。http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server –

+0

PIVOTを使用すると、ID列のソース値が次のようになります。出力内の各IDの列を表しますが、残りのソース列を行として表すことはできません。私はPIVOTで私が欲しいものをする方法を見ることができません。 – RedRocketFire

答えて

1

ダイナミックが必要な場合。

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(ID) From Yourtable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Column],' + @SQL + ' 
From (
     Select B.* 
     From YourTable A 
     Cross Apply (
         Values (1,''ID'' ,ID,ID) 
          ,(2,''XID'' ,ID,XID) 
          ,(3,''Amount'',ID,Amount) 
        ) B ([Seq],[Column],[Item],[Value]) 
    ) A 
Pivot (sum(Value) For [Item] in (' + @SQL + ')) p 
Order By [Seq] 
' 
Exec(@SQL); 

戻り

enter image description here

あなたがダイナミック

Select [Column],[11],[12],[13],[14] 
From (
     Select B.* 
     From YourTable A 
     Cross Apply (
         Values (1,'ID' ,ID,ID) 
          ,(2,'XID' ,ID,XID) 
          ,(3,'Amount',ID,Amount) 
        ) B ([Seq],[Column],[Item],[Value]) 
    ) A 
Pivot (sum(Value) For [Item] in ([11],[12],[13],[14])) p 
Order By [Seq] 
+0

これはすばらしい解決策です。ありがとう!!! – RedRocketFire

+0

@RedRocketFireハッピーが助けてくれました。ピボットよりもトランスポーズの方が:) –

関連する問題