我有一个数据库记录客户合同。每个合同都有一个有效期,它作为日期存储在合同开始和合同结束中。
我想创建一个视图,在每个月底显示每个客户上有多少合同处于活动状态。
下面的查询显示了执行此操作的愚蠢方式,我想知道是否可以创建一个自动执行此操作的“循环”:
SELECT
'2018-01-31' AS snapshot_day,
customer,
COUNT(*) AS active_contracts
FROM
my_table
WHERE
contract_start < '2018-02-01'
AND contract_end >= '2018-02-01'
GROUP BY 2
UNION SELECT
'2018-02-28' AS snapshot_day,
customer,
COUNT(*) AS active_contracts
FROM
my_table
WHERE
contract_start < '2018-03-01'
AND contract_end >= '2018-03-01'
GROUP BY 2
UNION SELECT
'2018-03-30' AS snapshot_day,
customer,
COUNT(*) AS active_contracts
FROM
my_table
WHERE
contract_start < '2018-04-01'
AND contract_end >= '2018-04-01'
GROUP BY 2
.
.
.
and so on
样本输入:
customer | contract_start | contract_end
CustA | 2018-01-22 | 2019-01-22
CustA | 2018-03-15 | 2019-03-15
CustA | 2018-07-10 | 2019-07-10
CustA | 2018-09-08 | 2018-12-10
CustB | 2018-02-17 | 2018-11-17
CustB | 2018-05-13 | 2019-05-13
CustB | 2018-10-01 | 2019-10-01
CustB | 2018-12-25 | 2019-12-25
期望输出:
snapshot_day | customer | active_contracts
2018-01-31 | CustA | 1
2018-02-28 | CustA | 1
2018-03-31 | CustA | 2
2018-04-30 | CustA | 2
2018-05-31 | CustA | 2
2018-06-30 | CustA | 2
2018-07-31 | CustA | 3
2018-08-31 | CustA | 3
2018-09-30 | CustA | 4
2018-10-31 | CustA | 4
2018-11-30 | CustA | 4
2018-12-31 | CustA | 3
2018-01-31 | CustB | 0
2018-02-28 | CustB | 1
2018-03-31 | CustB | 1
2018-04-30 | CustB | 1
2018-05-31 | CustB | 2
2018-06-30 | CustB | 2
2018-07-31 | CustB | 2
2018-08-31 | CustB | 2
2018-09-30 | CustB | 2
2018-10-31 | CustB | 3
2018-11-30 | CustB | 2
2018-12-31 | CustB | 2
提前谢谢!
2条答案
按热度按时间sulc1iza1#
也可以尝试按年份和月份分组:
x7yiwoj42#
考虑以下几点。这并不是最优雅的解决方案,它使用了一个实用程序表,这并不是绝对必要的(如果您使用的是mysql 8或更高版本,就更不用说了)。
然而,子查询的使用有希望使解决方案的各个步骤变得相当容易。
而且,我的结果和你的不一样。这可能是因为我考虑了在一个月的最后一天有多少活跃的合同,而你实际上是在追求一些稍微不同的东西。同样,也可能是因为你犯了个错误;-)
最后,如果你想为自己制作一个日历表,有很多关于它的教程。。。