我在哪里可以找到有关如何编写数据透视 SQL 查询的指南或示例?

Where can i find a guide or examples of how to write a pivot SQL query?

在哪里可以找到有关如何编写数据透视 SQL 查询的指南或示例?

我正在使用这个临时 table 作为练习。

Table 脚本:

CREATE TABLE #PVT (Vendor varchar(20), ConsultantID smallint, Billrate money);

INSERT #PVT VALUES 
('Volt Consulting',1,100), ('Volt Consulting',2,180), 
('Volt Consulting',3,200), ('Volt Consulting',4,120), 
('Volt Consulting',5,240), ('TekSystem Consulting',1,110), 
('TekSystem Consulting',2,120), ('TekSystem Consulting',3,130), 
('TekSystem Consulting',4,220), ('TekSystem Consulting',5,230), 
('Bridge Consulting',1,95), ('Bridge Consulting',2,90), 
('Bridge Consulting',3,104), ('Bridge Consulting',4,103), 
('Bridge Consulting',5,100), ('ChinaSoft Consulting',1,108), 
('ChinaSoft Consulting',2,115), ('ChinaSoft Consulting',3,125), 
('ChinaSoft Consulting',4,130), ('ChinaSoft Consulting',5,120), 
('Excell Data',1,140), ('Excell Data',2,143), 
('Excell Data',3,140), ('Excell Data',4,145), 
('Excell Data',5,200);

SELECT * 
FROM #PVT; 
GO

提前谢谢你:)

MSDN 上有一篇很好的文章,它通过示例解释了如何 PIVOT 或 UNPIVOT。下面是 PIVOTing 您的 table 的示例。

SELECT * 
FROM (
    SELECT  Vendor,
            ConsultantID,
            Billrate
    FROM #PVT
) as t
pivot
(
MAX(Billrate) FOR ConsultantID in ([1],[2],[3],[4],[5])
) as pvt

输出:

Vendor                  1       2       3       4       5
Bridge Consulting       95,00   90,00   104,00  103,00  100,00
ChinaSoft Consulting    108,00  115,00  125,00  130,00  120,00
Excell Data             140,00  143,00  140,00  145,00  200,00
TekSystem Consulting    110,00  120,00  130,00  220,00  230,00
Volt Consulting         100,00  180,00  200,00  120,00  240,00

在此示例中,我们知道将有 5 列 headers。如果您不知道有多少 - 您必须使用动态 SQL:

DECLARE @columns nvarchar(max),
        @sql nvarchar(max)
--Here we get [1],[2],[3],[4],[5] in the @columns variable to use in dynamic query
SELECT @columns = STUFF(
(SELECT DISTINCT ','+QUOTENAME(ConsultantID)
FROM #PVT
FOR XML PATH ('')),1,1,'')

SET @sql = 
'SELECT * 
FROM (
    SELECT  Vendor,
            ConsultantID,
            Billrate
    FROM #PVT
) as t
pivot
(
MAX(Billrate) FOR ConsultantID in ('+@columns+')
) as pvt'

EXEC (@sql)

输出将相同。

编辑

如果您想按供应商或顾问添加总计,请使用此功能(适用于 SQL Server 2008 及更高版本):

;WITH cte AS (
SELECT *, [1]+[2]+[3]+[4]+[5] as Totals
FROM (
    SELECT  Vendor,
            ConsultantID,
            Billrate
    FROM #PVT
) as t
pivot
(
MAX(Billrate) FOR ConsultantID in ([1],[2],[3],[4],[5])
) as pvt
)

SELECT *
FROM cte
UNION ALL
SELECT 'Total',SUM([1]),SUM([2]),SUM([3]),SUM([4]),SUM([5]), NULL as Totals
FROM cte

对于动态:

DECLARE @columns nvarchar(max),
        @sql nvarchar(max)

SELECT @columns = STUFF(
(SELECT DISTINCT ','+QUOTENAME(ConsultantID)
FROM #PVT
FOR XML PATH ('')),1,1,'')

SET @sql = 
';WITH cte AS (
SELECT *, ' + REPLACE(@columns,',','+') +' as Totals
FROM (
    SELECT  Vendor,
            ConsultantID,
            Billrate
    FROM #PVT
) as t
pivot
(
MAX(Billrate) FOR ConsultantID in ('+@columns+')
) as pvt
)

SELECT *
FROM cte
UNION ALL
SELECT ''Total'',SUM(' + REPLACE(@columns,',','),SUM(') + '), NULL as Totals
FROM cte
'

EXEC (@sql)

输出:

Vendor                  1       2       3       4       5       Totals
Bridge Consulting       95,00   90,00   104,00  103,00  100,00  492,00
ChinaSoft Consulting    108,00  115,00  125,00  130,00  120,00  598,00
Excell Data             140,00  143,00  140,00  145,00  200,00  768,00
TekSystem Consulting    110,00  120,00  130,00  220,00  230,00  810,00
Volt Consulting         100,00  180,00  200,00  120,00  240,00  840,00
Total                   553,00  648,00  699,00  718,00  890,00  NULL