【发布时间】:2024-01-24 01:00:01
【问题描述】:
下午好,
希望你一切都好,祝你新年快乐。
我在写的查询中遇到了一些奇怪的行为,即 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 的进位!这不平衡 - 或者这是这里问题的表现?我添加了一个答案,解释了通常如何得出平衡。
标签: sql sql-server sql-server-2012 window-functions