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

SQL Server 2012 - Running Total With Backlog & Carry Forward

下午好,

希望你一切都好,祝你新年快乐。

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

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

然后我正在做的是添加一个 'Backlog' 列(在所有情况下第一个月为 0)和一个 'Carried Forward' 列。结转金额将是该月的余额(已创建 + 待办事项),并将反映为下个月的待办事项。

在我意识到负面积压有点捏造数字之前,我一直很好地解决这个问题。我的意思是,例如:

在这种情况下,为了我们的报告目的,我不得不将所有负面积压归零。

这似乎是问题所在。在最初的几个月里,一切都会好起来的——数值会是正确的,将正确的数字进行计算,并将它们相应地计入计算中。但随后它将携带一些(看似)不确定的来源,这当然会对超过这一点的准确性产生连锁反应。

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

虽然我很高兴 post 编写代码(我已经尝试了几种给这只猫剥皮的方法),但我觉得好像有人能够对它如何进行高级概述应该写了,我马上看看哪里错了。在这样做的时候,为了完整性,我会用我的 attempt/s 做出相应的回应。

非常感谢您!

结果错误图片:

, 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

来自对问题的评论。顺便说一句,应该以某种方式重做 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