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 - 使用积压和结转运行总计的主要内容,如果未能解决你的问题,请参考以下文章