【问题标题】:Query extra reservation count for each date and car type查询每个日期和车型的额外预订次数
【发布时间】:2019-02-22 11:54:56
【问题描述】:

我想查询每个日期(提供日期范围)和每种汽车类型有多少汽车被超额预订。

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-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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这个问题的答案有几个部分。首先,您需要构建一个日期列表。您可以使用递归 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;
    

    【讨论】:

    • 如您在示例中看到的,我们不能从汽车数量中减去预订数量。 @gordon-linoff
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多