SQL将列移动到行

时间:2017-02-16 15:20:00

标签: sql sql-server pivot dynamic-sql unpivot

我需要从存储过程输出数据作为结果集,其中源数据的列在输出中表示为行。我应该在输出中的每个列中看到一行,这是我的源数据中的一行,我应该在输出中看到源数据中每一行的列。我只是不知道如何使用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

*/

1 个答案:

答案 0 :(得分: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]