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

标签 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 年 1 月 05 日,我们有两辆车可用,因为 2019 年 1 月 1 日的两辆车现在可用,所以 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;

关于mysql - 查询每个日期和车型的额外预订数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54826554/

相关文章:

php - MySQL PDO 限制问题

Mysql - 数据库中的表情符号字符

Android:网络服务、离线能力

mysql - 使用 SQL 进行分组并保留初始记录

java - ORA-02289 : sequence does not exist - Error selecting key or setting result to parameter object

sql - 主键自增操作

sql - T-SQL 内连接

sql - InnoDB 排序真的那么慢吗?

php - 我想进行查询,从多个表中检索多个列

mysql - 复杂的 SQL 查询