2017-02-16 50 views
1

我需要从存储过程输出数据作为结果集,其中源数据的列在输出中表示为行。我应该在输出中的每个列中看到一行记录,这些记录位于我的源数据中,并且我的输出中的每一行都会在我的源数据中看到一列。我只是没有看到我可以如何使用Pivot或其他我看过的方法来做到这一点。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对它有帮助。更多的转置比枢轴:) –