SQL Server 2012 - 运行 总计积压和结转
SQL Server 2012 - Running Total With Backlog & Carry Forward
下午好,
希望你一切都好,祝你新年快乐。
我在 LAG 函数不一致的查询中遇到了一些奇怪的行为。
基本上,我有一个数据集(由 2 个 CTE 组成),每个 CTE 都包含月份(以 MMM-YYYY 格式),然后一个包含打开的票数,另一个包含相同但关闭的票.
然后我正在做的是添加一个 'Backlog' 列(在所有情况下第一个月为 0)和一个 'Carried Forward' 列。结转金额将是该月的余额(已创建 + 待办事项),并将反映为下个月的待办事项。
在我意识到负面积压有点捏造数字之前,我一直很好地解决这个问题。我的意思是,例如:
- 创建了 10 张票
- 12 票已解决
- 0 票积压
- -2 票结转
在这种情况下,为了我们的报告目的,我不得不将所有负面积压归零。
这似乎是问题所在。在最初的几个月里,一切都会好起来的——数值会是正确的,将正确的数字进行计算,并将它们相应地计入计算中。但随后它将携带一些(看似)不确定的来源,这当然会对超过这一点的准确性产生连锁反应。
使用 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
下午好,
希望你一切都好,祝你新年快乐。
我在 LAG 函数不一致的查询中遇到了一些奇怪的行为。
基本上,我有一个数据集(由 2 个 CTE 组成),每个 CTE 都包含月份(以 MMM-YYYY 格式),然后一个包含打开的票数,另一个包含相同但关闭的票.
然后我正在做的是添加一个 'Backlog' 列(在所有情况下第一个月为 0)和一个 'Carried Forward' 列。结转金额将是该月的余额(已创建 + 待办事项),并将反映为下个月的待办事项。
在我意识到负面积压有点捏造数字之前,我一直很好地解决这个问题。我的意思是,例如:
- 创建了 10 张票
- 12 票已解决
- 0 票积压
- -2 票结转
在这种情况下,为了我们的报告目的,我不得不将所有负面积压归零。
这似乎是问题所在。在最初的几个月里,一切都会好起来的——数值会是正确的,将正确的数字进行计算,并将它们相应地计入计算中。但随后它将携带一些(看似)不确定的来源,这当然会对超过这一点的准确性产生连锁反应。
使用 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