我想查询每个日期(提供日期范围)和每种车型预订的汽车数量。
日期范围2019-01-01
到2019-01-06
的所需输出如下。
date ,car , available
2019-01-01,ECONOMY,-1 (cars available - reservation i.e 2 - 3 = -1)
2019-01-02,ECONOMY, 0 (cars available - reservation i.e 0 - 0 = 0)
2019-01-03,ECONOMY, 0 (cars available - reservation i.e 0 - 0 = 0)
2019-01-04,ECONOMY, 0 (cars available - reservation i.e 0 - 0 = 0)
2019-01-05,ECONOMY, 2 (cars available - reservation i.e 2 - 0 = 2)
2019-01-06,ECONOMY, 2 (cars available - reservation i.e 2 - 0 = 2)
说明:
对于2019-01-01的日期,我们有两辆车可用,预订数为3,所以我们已经预订了1辆车,即-1
对于2019-01-02日期,我们有零汽车可用,因为可用的两辆汽车在2019-01-01日期消失,预订计数为零所以0-0 = 0
对于2019-01-05的日期,我们有两辆车可用,因为2019-01-01的两辆车现已上市,所以2 - 0 = 2
我正在使用MySQL 8
这个问题的答案有几个部分。首先,您需要构建一个日期列表。你可以使用递归CTE来做到这一点。
其次,您想要生成日期和汽车的所有组合。然后计算每天的预订数量,并从计数中减去这个数字:
with recursive dates as (
select date('2019-01-01') as dte
union all
select dte + interval 1 day
from dates
where dte < '2019-01-06'
)
select c.name, d.dte,
( c.cnt - count(r.id) ) as cars available
from dates d cross join
cars c left join
reservations r
on c.name = r.car_type and
d.dte >= r.date_out and
d.dte <= r.date_in
group by c.name, d.dte, c.cnt;