如何为此方案编写SQL Pivot查询?

时间:2015-03-03 10:13:00

标签: sql-server pivot

我正在使用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)我必须保留此声明"和FOC_NETAMOUNT不喜欢' - %'",以便枢轴不会汇总FOC_NETAMOUNT列中的负数。 (2)为了便于说明,我在FOC_TCODE列中只显示了一些项目。实际上,我不知道存在多少项(可能大约30个),我的目标是将这些项输出为列标题。

上面的注释(2)是一个难以破解的东西(至少对我而言!)。

1 个答案:

答案 0 :(得分:1)

您需要使用Dynamic pivot

在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