如何为这种情况编写 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