我在哪里可以找到有关如何编写数据透视 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
在哪里可以找到有关如何编写数据透视 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