SQL 运行 过去 3 个月的总计(按日期和 ID)
SQL Running total previous 3 months by date and id
这是我正在使用的 table q3 的简化版:
Partno EndOfMonth AA AS EA ES
a 31.5.2017 5 1 0 1
b 31.5.2017 3 1 0 1
c 31.5.2017 2 2 0 1
a 31.6.2017 1 2 2 2
b 31.6.2017 1 0 1 2
c 31.6.2017 2 3 1 4
a 31.7.2017 4 3 2 0
b 31.7.2017 3 0 6 0
c 31.7.2017 4 1 0 0
我需要对 Partno 中每个部分的最后四列中的数字求和,以便总和代表 运行 最后三个月在 EndOfMonth 列中每个日期的总数。
我要找的结果是:
Partno EndOfMonth AA AS EA ES
a 31.5.2017 5 1 0 1
b 31.5.2017 3 1 0 1
c 31.5.2017 2 2 0 1
a 31.6.2017 6 3 2 3
b 31.6.2017 6 1 1 3
c 31.6.2017 4 5 1 5
a 31.7.2017 10 6 4 3
b 31.7.2017 7 1 7 3
c 31.7.2017 8 6 1 5
例如对于 2017 年 7 月 31 日的 partno A,'AA' 列的最后一个月的总和是 4+1+5=10.
我对 SQL 还是个新手,对此我深信不疑。我已经尝试了类似下面的方法来获得一个简单的滚动总数(甚至没有指定最近 3 个月的总和范围)。另外,我不确定数据库是否支持下面代码中的所有功能,因为它给我错误 "Incorrect Syntax near the keyword 'OVER'"
SELECT
Partno,
EndofMonth,
SUM(q3.AA) OVER (PARTITION BY q3.Partno ORDER BY EndofMonth ROWS UNBOUNDED PRECEDING) as 'AA'
FROM q3
无论如何,我们将不胜感激!
谢谢
编辑:
感谢 Benjamin 以及此 post 的一点帮助:https://dba.stackexchange.com/questions/114403/date-range-rolling-sum-using-window-functions
我找到了解决方案:
SELECT a.Partno, a.EndofMonth, SUM(b.AA) as 'AA', SUM(b.AS) as 'AS',...
FROM q3 a, q3 b
WHERE a.Partno = b.Partno AND a.endOfMonth >= b.endOfMonth
AND b.endOfMonth >= DATEADD(month,-2,a.endOfMonth)
GROUP BY a.Partno, a.endOfMonth
类似这样的方法可能有效:
SELECT a.Partno, a.EndofMonth, SUM(b.AA) as AA
FROM q3 a, q3 b
WHERE a.Partno = b.Partno
AND DATEDIFF(month, b.endOfMonth, a.endOfMonth) < 4
GROUP BY a.Partno, b.Partno
这里假设 endOfMonth 是日期时间格式,否则您将不得不使用 convert()。请注意,您可能必须根据您使用的实现替换 DATEDIFF()。
我还没有测试过这个,所以我可能离题太远了。我和 SQL 一起工作已经有一段时间了。希望你可以通过稍微弄乱它来让它工作,如果没有,那么它可能会激励你写出更好的东西。让我知道进展如何!
这是我正在使用的 table q3 的简化版:
Partno EndOfMonth AA AS EA ES
a 31.5.2017 5 1 0 1
b 31.5.2017 3 1 0 1
c 31.5.2017 2 2 0 1
a 31.6.2017 1 2 2 2
b 31.6.2017 1 0 1 2
c 31.6.2017 2 3 1 4
a 31.7.2017 4 3 2 0
b 31.7.2017 3 0 6 0
c 31.7.2017 4 1 0 0
我需要对 Partno 中每个部分的最后四列中的数字求和,以便总和代表 运行 最后三个月在 EndOfMonth 列中每个日期的总数。
我要找的结果是:
Partno EndOfMonth AA AS EA ES
a 31.5.2017 5 1 0 1
b 31.5.2017 3 1 0 1
c 31.5.2017 2 2 0 1
a 31.6.2017 6 3 2 3
b 31.6.2017 6 1 1 3
c 31.6.2017 4 5 1 5
a 31.7.2017 10 6 4 3
b 31.7.2017 7 1 7 3
c 31.7.2017 8 6 1 5
例如对于 2017 年 7 月 31 日的 partno A,'AA' 列的最后一个月的总和是 4+1+5=10.
我对 SQL 还是个新手,对此我深信不疑。我已经尝试了类似下面的方法来获得一个简单的滚动总数(甚至没有指定最近 3 个月的总和范围)。另外,我不确定数据库是否支持下面代码中的所有功能,因为它给我错误 "Incorrect Syntax near the keyword 'OVER'"
SELECT
Partno,
EndofMonth,
SUM(q3.AA) OVER (PARTITION BY q3.Partno ORDER BY EndofMonth ROWS UNBOUNDED PRECEDING) as 'AA'
FROM q3
无论如何,我们将不胜感激!
谢谢
编辑:
感谢 Benjamin 以及此 post 的一点帮助:https://dba.stackexchange.com/questions/114403/date-range-rolling-sum-using-window-functions 我找到了解决方案:
SELECT a.Partno, a.EndofMonth, SUM(b.AA) as 'AA', SUM(b.AS) as 'AS',...
FROM q3 a, q3 b
WHERE a.Partno = b.Partno AND a.endOfMonth >= b.endOfMonth
AND b.endOfMonth >= DATEADD(month,-2,a.endOfMonth)
GROUP BY a.Partno, a.endOfMonth
类似这样的方法可能有效:
SELECT a.Partno, a.EndofMonth, SUM(b.AA) as AA
FROM q3 a, q3 b
WHERE a.Partno = b.Partno
AND DATEDIFF(month, b.endOfMonth, a.endOfMonth) < 4
GROUP BY a.Partno, b.Partno
这里假设 endOfMonth 是日期时间格式,否则您将不得不使用 convert()。请注意,您可能必须根据您使用的实现替换 DATEDIFF()。
我还没有测试过这个,所以我可能离题太远了。我和 SQL 一起工作已经有一段时间了。希望你可以通过稍微弄乱它来让它工作,如果没有,那么它可能会激励你写出更好的东西。让我知道进展如何!