我想查询每个日期(提供日期范围)和每种汽车类型的预订量过大的汽车。
以下是日期范围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年1月1日,我们有两辆车可用,预订数量为3,所以我们已经超额预订了1辆车,即-1
对于2019年1月2日,我们有0辆车可供使用,因为两辆可用车已于2019年1月1日失效,预订数量为零,所以0-0 = 0
对于日期2019-01-05,我们有两辆车可用,因为这两辆车将于2019-01-01上市,因此2-0 = 2
我正在使用MySQL 8
答案 0 :(得分:0)
这个问题的答案分为几个部分。首先,您需要构造一个日期列表。您可以使用递归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;