Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何为此场景编写SQL Pivot查询?_Sql Server_Pivot - Fatal编程技术网

Sql server 如何为此场景编写SQL Pivot查询?

Sql server 如何为此场景编写SQL Pivot查询?,sql-server,pivot,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

我使用的是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
我很难编写pivot查询,因此我的输出结果如下:

FOH_PMSCONFNUM   FOC_ACCOUNT   FOC_ PROPERTY  ROOMS   zBev    zTel   zSpa
125                52            BMA          2,400   900     300    500
此外,在运行此pivot查询时,我需要考虑两件事:

(1) 我必须保留此语句“并且FOC_NETAMOUNT与'-%'不同”,这样轴就不会对FOC_NETAMOUNT列中的负数求和。 (2) 为了便于说明,我只展示了FOC_TCODE列中存在的几个项目。实际上,我不知道存在多少项(可能大约30项),我的目标是将这些项作为列标题输出


上面的注释(2)是一个很难解决的问题(至少对我来说!)。

您需要使用
动态枢轴

在Pivot源查询中,将负值设为零,这样就不会在Pivot的总和聚合中使用它

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 

谢谢我会尝试一下,但我对“你的结果”感到困惑。这是我最初查询的结果吗?如果是的话,我该如何在你的询问中提到这一点?非常感谢你的努力。我收到了以下错误消息:“Msg 102,级别15,状态1,第25行'+@cols+'附近的语法不正确。”顺便问一下,为什么要将1458和-%放在双精度''之间?我想我也应该删除SELECT*之前的单个标记,以及pv?user3115933 No之后的结尾处的单个标记。不要删除任何内容。为了供您参考,我在这里创建了一个工作示例。非常感谢!工作得很漂亮!:-)