sql - 基于计费周期的用户年度总支出 (SQL)
问题描述
我想根据我们开始周期的特定月份来跟踪用户的年度支出。这是为了跟踪他们的年度支出,以免超出允许的限制。我有以下两个表:
花费(每个用户每月包含 1 行)(如果有帮助,我可以根据需要将此表的日期列修改为任何日期格式):
+----+-----------+------+-------+-------+
| ID | Date | Year | Month | Spend |
+----+-----------+------+-------+-------+
| 11 | 01-Sep-19 | 2019 | 9 | 10 |
+----+-----------+------+-------+-------+
| 11 | 01-Oct-19 | 2019 | 10 | 23 |
+----+-----------+------+-------+-------+
| 11 | 01-Nov-19 | 2019 | 11 | 27 |
+----+-----------+------+-------+-------+
| 11 | 01-Dec-19 | 2019 | 12 | 14 |
+----+-----------+------+-------+-------+
| 11 | 01-Jan-20 | 2020 | 1 | 13 |
+----+-----------+------+-------+-------+
| 11 | 01-Feb-20 | 2020 | 2 | 33 |
+----+-----------+------+-------+-------+
| 11 | 01-Mar-20 | 2020 | 3 | 25 |
+----+-----------+------+-------+-------+
| 11 | 01-Apr-20 | 2020 | 4 | 17 |
+----+-----------+------+-------+-------+
| 11 | 01-May-20 | 2020 | 5 | 14 |
+----+-----------+------+-------+-------+
| 11 | 01-Jun-20 | 2020 | 6 | 10 |
+----+-----------+------+-------+-------+
| 11 | 01-Jul-20 | 2020 | 7 | 46 |
+----+-----------+------+-------+-------+
| 11 | 01-Aug-20 | 2020 | 8 | 53 |
+----+-----------+------+-------+-------+
| 11 | 01-Sep-20 | 2020 | 9 | 38 |
+----+-----------+------+-------+-------+
| 11 | 01-Oct-20 | 2020 | 10 | 22 |
+----+-----------+------+-------+-------+
| 11 | 01-Nov-20 | 2020 | 11 | 29 |
+----+-----------+------+-------+-------+
| 50 | 01-Jul-20 | 2020 | 7 | 56 |
+----+-----------+------+-------+-------+
| 50 | 01-Aug-20 | 2020 | 8 | 62 |
+----+-----------+------+-------+-------+
| 50 | 01-Sep-20 | 2020 | 9 | 77 |
+----+-----------+------+-------+-------+
| 50 | 01-Oct-20 | 2020 | 10 | 52 |
+----+-----------+------+-------+-------+
| 50 | 01-Nov-20 | 2020 | 11 | 45 |
+----+-----------+------+-------+-------+
计费周期(包含我们计算其总支出的月份):
+-----+------------+----------+
| ID | StartMonth | EndMonth |
+-----+------------+----------+
| 11 | 10 | 9 |
+-----+------------+----------+
| 50 | 9 | 8 |
+-----+------------+----------+
样本输出:
+----+-------+------------+
| ID | Cycle | TotalSpend |
+----+-------+------------+
| 11 | 1 | 10 |
+----+-------+------------+
| 11 | 2 | 313 |
+----+-------+------------+
| 11 | 3 | 51 |
+----+-------+------------+
| 50 | 1 | 118 |
+----+-------+------------+
| 50 | 2 | 174 |
+----+-------+------------+
在示例输出中,对于 ID = 11,周期 1 表示 19 年 9 月的支出,周期 2 表示从 2019 年 10 月(第 10 个月)到 20 年 9 月(第 9 个月)的总支出,周期 3 表示接下来 12 年的总支出从 20 年 10 月开始的月份(直到有数据的月份)。
我是 SQL 的初学者,我相信这样做可能需要使用 CTE/子查询。将不胜感激任何帮助或指导。
解决方案
由于这似乎是某种形式的练习,因此我不会提供完整的答案,但会提示您如何从概念上解决此问题。
首先,我认为您应该将条目与所需日期范围内的有效周期(带有周期号)相关联。这可以通过使用递归 CTE 来完成。这些不是最有效的方法,但由于我们没有有效的循环,它们的数字作为一个不同的表格,它仍然是一个可行的解决方案。
然后,只需按 ID 和周期数对结果进行分组,然后汇总数量,就完成了。
推荐阅读
- c# - 如何在运行时添加视图而不使用 wpf 中的 ViewModel
- python - 如何使用张量流在推理阶段加载移动平均权重变量
- django - django PasswordChangeView 总是重定向到登录
- android - 反应原生android错误SyntaxError:JSON中位置0的意外标记
- r - 无法打开共享对象文件:没有这样的文件或目录 Rglpk
- asp.net - 如何将数据发送到客户端系统的端口?
- sql - 执行批处理时出错。错误消息是:指定的签名大小为零。(HRESULT 异常:0x80131237)
- java - 为什么在下面的代码中使用两个大括号?这里不是匿名内部类)
- netty - Netty ChannelHandler的exceptionCaught和channelInactive有什么区别
- git - git - rebase 分支,建立在另一个之上,在 master 上