首页 > 解决方案 > 基于计费周期的用户年度总支出 (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/子查询。将不胜感激任何帮助或指导。

标签: sqlsql-server

解决方案


由于这似乎是某种形式的练习,因此我不会提供完整的答案,但会提示您如何从概念上解决此问题。

首先,我认为您应该将条目与所需日期范围内的有效周期(带有周期号)相关联。这可以通过使用递归 CTE 来完成。这些不是最有效的方法,但由于我们没有有效的循环,它们的数字作为一个不同的表格,它仍然是一个可行的解决方案。

然后,只需按 ID 和周期数对结果进行分组,然后汇总数量,就完成了。


推荐阅读