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