SQL Server 2012 - 使用积压和结转运行总计

问题描述 投票:1回答:1

下午好,

希望你们一切顺利,祝你新年快乐。

我在写一个LAG函数不一致的查询时遇到了一些奇怪的行为。

基本上,我有一个数据集(由2个CTE组成),每个数据集包含月份(以MMM-YYYY格式),然后一个包含打开的票证计数,另一个包含相同的但是关闭票证。

我当时正在做的是添加一个'Backlog'列(在所有情况下第一个月都是0)和一个'Carried Forward'列。承诺金额将是该月的余额(创建+积压),并将反映为下个月的积压。

直到我意识到负面的积压工作有点捏造这些数字之前,我已经很好地完成了这个问题。我的意思是,例如:

  • 10张门票已创建
  • 12张门票已经解决
  • 0票证积压
  • -2门票继承

在这种情况下,我不得不将任何负面积压归零以用于报告目的。

这似乎是问题发生的地方。在最初的几个月里,一切都会好起来的 - 价值是正确的,推进正确的数字,并将它们计入相应的计算中。但随后它将带来一些(看似)不确定的起源,当然,这对于此时的准确性具有连锁效应。

使用SQL Server 2012引入的Window函数,这应该是非常基本的 - 但显然不是!

虽然我很乐意发布代码(我已经尝试了几种方法来剥离这只猫),我觉得如果有人能够高度概述它应该如何编写,我会看到我立刻出错了。在这样做的时候,我会相应地回应我的完成尝试。

非常感谢你提前!

结果错误图片:

This is where the error occurs

, OpenClosed AS
(
SELECT
  c.[Created Month] 'Month'
, c.Tickets 'Created'
, r.Tickets 'Resolved'
, IIF( ( c.Tickets - r.Tickets ) < 0, 0, ( c.Tickets - r.Tickets ) ) 'Balance'

FROM
  Created c

JOIN Resolved r ON
  c.[Created Month] = r.[Resolved Month]
)

, CarryForward AS
(
SELECT
  ROW_NUMBER() OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) 'Row No'
, Month 'Month'
, Created 'Created'
, Resolved 'Resolved'
, LAG( Balance, 1, 0 ) OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) 'Backlog'

, IIF( ( ( Created + LAG( Balance, 1, 0 ) OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) ) - Resolved ) < 0
      , 0
      , ( ( Created + LAG( Balance, 1, 0 ) OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) ) - Resolved )
         ) 'Carry Forward'

FROM
  OpenClosed
)

SELECT
  c1.Month 'Month'
, c1.Created 'Created'
, c1.Resolved 'Resolved'
, c2.[Carry Forward] 'Backlog'
, IIF( ( c1.Created + c2.[Carry Forward] ) - c1.Resolved < 0
      , 0
      , ( c1.Created + c2.[Carry Forward] ) - c1.Resolved
         ) 'Carried Forward'

FROM
  CarryForward c1

JOIN CarryForward c2 ON
  c2.[Row No] = c1.[Row No]-1
sql sql-server sql-server-2012 window-functions
1个回答
1
投票

来自对问题的评论。顺便说一句,Created Month列应该以某种方式重做,以便将年份放在月份之前 - 就像2015-01一样。这将确保默认排序算法的正确排序。

如果日期必须在最终报告中显示为Jan-2015,请将该表示工作作为查询中的最后一步。

WITH ticket_account AS
(
    SELECT
         c.[Created Month]  AS Month
        ,c.Tickets          AS Created
        ,r.Tickets          AS Resolved

    FROM
      Created AS c

    INNER JOIN 
        Resolved AS r 
        ON c.[Created Month] = r.[Resolved Month]
)

SELECT
    *
    ,(SUM(Created) OVER (ORDER BY Month ASC) - SUM(Resolved) OVER (ORDER BY Month ASC)) AS Balance

FROM
    ticket_account
© www.soinside.com 2019 - 2024. All rights reserved.