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

Posted

技术标签:

【中文标题】SQL Server 2012 - 使用积压和结转运行总计【英文标题】:SQL Server 2012 - Running Total With Backlog & Carry Forward 【发布时间】:2018-01-02 15:09:43 【问题描述】:

下午好,

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

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

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

然后我要做的是添加一个“积压”列(在所有情况下第一个月都为 0)和一个“结转”列。结转金额将是当月的余额( Created + Backlog ),并将反映为下个月的 Backlog。

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

已创建 10 个工单 12 票已解决 0 票积压 -2 票证结转

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

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

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

虽然我很高兴发布代码(我已经尝试了几种给这只猫剥皮的方法),但我觉得好像有人能够对它应该如何编写给出一个高级概述,我'我会立即看到我哪里出错了。在此过程中,我将根据我的尝试做出相应的回应,以确保完整性。

非常感谢您!

结果错误图片:

, 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

【问题讨论】:

为什么要告诉你什么时候可以Show Teh Codez? :) 请提供一些代码示例。您可以使用“sum(Quantity) over (partition by ProductId order by MovementDate rows unbounded before) as sumIn” 语法来运行 sum。样品请查看kodyaz.com/sap-abap/… 检查这个***.com/questions/22235959/…也许会有所帮助 如果您要保持流动余额,您还需要包含提前金额。我看不出如何创建 10 并解决 12,除非暗示 2 已从上一个报告期结转(在这种情况下结转将是 0 而不是 -2)。 @HendrixAndChill,我不明白你的数字在算术方面是如何有意义的。 8 月 15 日,创建了 50 个,解决了 52 个,但只有 1 的积压和 0 的进位!这不平衡 - 或者这是这里问题的表现?我添加了一个答案,解释了通常如何得出平衡。 【参考方案1】:

来自 cmets 的问题。顺便说一句,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

【讨论】:

这个答案是正确的 - 我的问题是由于不正确的连接类型打折了一些错误数据(请参阅问题 cmets)。

以上是关于SQL Server 2012 - 使用积压和结转运行总计的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 查询中结转/结转余额

SQL查询预支薪金盘点,结转月结余

sql 结转

java+sql实现mysql数据表的数据结转

听()忽略积压值

TFS 2012 积压优先级