SQL 将列移动到行

SQL moving columns to rows

我需要从存储过程输出数据作为结果集,其中我的源数据的列在输出中表示为行。我应该在源数据中的输出中看到每一列对应一行,并且我应该在源数据中的每一行的输出中看到一列。我只是不知道如何使用 Pivot 或我看过的其他方法来做到这一点。

一旦我按照我喜欢的方式设置了数据方向,我想我会查询 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

*/

假设您需要动态。

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);

Returns

如果不需要动态

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]