如何为这种情况编写 SQL 数据透视查询?
How to write an SQL Pivot Query for this scenario?
我正在使用 SQL Server 2014,我有以下运行良好的查询:
SELECT b.FOH_PMSCONFNUM,
a.FOC_ACCOUNT,
a.FOC_PROPERTY,
a.FOC_TCODE,
a.FOC_NETAMOUNT
FROM P5FOLIOCHARGE a
LEFT JOIN P5FOLIOHEADER b ON a.FOC_ACCOUNT = b.FOH_ACCOUNT
where b.FOH_PMSCONFNUM = '1458' AND FOC_NETAMOUNT NOT LIKE '-%'
它给我以下输出:
FOH_PMSCONFNUM FOC_ACCOUNT FOC_PROPERTY FOC_TCODE FOC_NETAMOUNT
125 52 BMA ROOMS 1,200
125 52 BMA zBev 900
125 52 BMA zTel 200
125 52 BMA ROOMS 1,200
125 52 BMA zSpa 500
125 52 BMA zTel 100
我在编写数据透视查询时遇到了困难,因此我的输出结果如下:
FOH_PMSCONFNUM FOC_ACCOUNT FOC_ PROPERTY ROOMS zBev zTel zSpa
125 52 BMA 2,400 900 300 500
此外,在 运行 这个数据透视查询中,我需要考虑两件事:
(1) 我必须保留此语句 "AND FOC_NETAMOUNT NOT LIKE '-%'",以便主元不会对 FOC_NETAMOUNT 列中出现的负数求和。
(2) 此处出于说明目的,我仅显示了 FOC_TCODE 列中存在的几个项目。实际上,我不知道存在多少项目(可能大约 30 个),我的目标是将这些项目输出为 headers.
列
上面的注释(2)是一个难题(至少对我来说是这样!)。
您需要使用Dynamic pivot
在数据透视源查询中将负值设为零,这样它就不会被用于数据透视表的 SUM 聚合中
DECLARE @sql NVARCHAR(max),
@cols VARCHAR(max)
SET @cols = (SELECT DISTINCT a.FOC_TCODE + ','
FROM P5FOLIOCHARGE a
LEFT JOIN P5FOLIOHEADER b
ON a.FOC_ACCOUNT = b.FOH_ACCOUNT
WHERE b.FOH_PMSCONFNUM = '1458'
AND FOC_NETAMOUNT NOT LIKE '-%'
FOR xml path(''))
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
SET @sql = 'SELECT *
FROM (SELECT b.FOH_PMSCONFNUM,
a.FOC_ACCOUNT,
a.FOC_PROPERTY,
a.FOC_TCODE,
CASE WHEN a.FOC_NETAMOUNT > 0 THEN a.FOC_NETAMOUNT ELSE 0 END AS FOC_NETAMOUNT
FROM P5FOLIOCHARGE a
LEFT JOIN P5FOLIOHEADER b ON a.FOC_ACCOUNT = b.FOH_ACCOUNT
where b.FOH_PMSCONFNUM = ''1458''
AND FOC_NETAMOUNT NOT LIKE ''-%'')a
PIVOT (Sum(FOC_NETAMOUNT)
FOR FOC_TCODE IN (' + @cols + ')) pv '
EXEC Sp_executesql @sql
我正在使用 SQL Server 2014,我有以下运行良好的查询:
SELECT b.FOH_PMSCONFNUM,
a.FOC_ACCOUNT,
a.FOC_PROPERTY,
a.FOC_TCODE,
a.FOC_NETAMOUNT
FROM P5FOLIOCHARGE a
LEFT JOIN P5FOLIOHEADER b ON a.FOC_ACCOUNT = b.FOH_ACCOUNT
where b.FOH_PMSCONFNUM = '1458' AND FOC_NETAMOUNT NOT LIKE '-%'
它给我以下输出:
FOH_PMSCONFNUM FOC_ACCOUNT FOC_PROPERTY FOC_TCODE FOC_NETAMOUNT
125 52 BMA ROOMS 1,200
125 52 BMA zBev 900
125 52 BMA zTel 200
125 52 BMA ROOMS 1,200
125 52 BMA zSpa 500
125 52 BMA zTel 100
我在编写数据透视查询时遇到了困难,因此我的输出结果如下:
FOH_PMSCONFNUM FOC_ACCOUNT FOC_ PROPERTY ROOMS zBev zTel zSpa
125 52 BMA 2,400 900 300 500
此外,在 运行 这个数据透视查询中,我需要考虑两件事:
(1) 我必须保留此语句 "AND FOC_NETAMOUNT NOT LIKE '-%'",以便主元不会对 FOC_NETAMOUNT 列中出现的负数求和。 (2) 此处出于说明目的,我仅显示了 FOC_TCODE 列中存在的几个项目。实际上,我不知道存在多少项目(可能大约 30 个),我的目标是将这些项目输出为 headers.
列上面的注释(2)是一个难题(至少对我来说是这样!)。
您需要使用Dynamic pivot
在数据透视源查询中将负值设为零,这样它就不会被用于数据透视表的 SUM 聚合中
DECLARE @sql NVARCHAR(max),
@cols VARCHAR(max)
SET @cols = (SELECT DISTINCT a.FOC_TCODE + ','
FROM P5FOLIOCHARGE a
LEFT JOIN P5FOLIOHEADER b
ON a.FOC_ACCOUNT = b.FOH_ACCOUNT
WHERE b.FOH_PMSCONFNUM = '1458'
AND FOC_NETAMOUNT NOT LIKE '-%'
FOR xml path(''))
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
SET @sql = 'SELECT *
FROM (SELECT b.FOH_PMSCONFNUM,
a.FOC_ACCOUNT,
a.FOC_PROPERTY,
a.FOC_TCODE,
CASE WHEN a.FOC_NETAMOUNT > 0 THEN a.FOC_NETAMOUNT ELSE 0 END AS FOC_NETAMOUNT
FROM P5FOLIOCHARGE a
LEFT JOIN P5FOLIOHEADER b ON a.FOC_ACCOUNT = b.FOH_ACCOUNT
where b.FOH_PMSCONFNUM = ''1458''
AND FOC_NETAMOUNT NOT LIKE ''-%'')a
PIVOT (Sum(FOC_NETAMOUNT)
FOR FOC_TCODE IN (' + @cols + ')) pv '
EXEC Sp_executesql @sql