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