查询每个日期和车型的额外预订数量

时间:2019-02-22 11:54:57

标签: mysql sql

我想查询每个日期(提供日期范围)和每种汽车类型的预订量过大的汽车。

SQL Fiddle Schema

以下是日期范围2019-01-012019-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

1 个答案:

答案 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;