首页 > 解决方案 > 如何计算 MySQL 递归 CTE 中的 Running Total?

问题描述

我有一个预订数据库内容的开始、结束日期以及成人和儿童的编号。我正在创建一个查询,计算每天预订房间的总数以及成人和儿童的总数。每条记录代表一个房间,因此计算 ID 会给我房间总数。但是,在递归部分,我的总和没有带来正确的成人和儿童总和。

以下是我的表和查询结构。感谢您是否愿意协助合作。

桌子:

CREATE TABLE `bookings` (
  `id` int(11) NOT NULL,
  `res_start` date DEFAULT NULL,
  `res_end` date DEFAULT NULL,
  `adult` double NOT NULL DEFAULT 0,
  `child` double NOT NULL DEFAULT 0,

询问:

SET @runadt:=0;
SET @rundhd:=0;
WITH RECURSIVE cte AS (
    SELECT
      id,
      (@runadt := @runadt + adult) AS adult_fc,
      (@runchd := @runchd + child) AS child_fc,
      res_start as date_from,
      res_end as date_to,
      res_end as _du
    FROM bookings
    UNION ALL
    SELECT 
      id,
      adult_fc,
      Child_fc,
      DATE_ADD(cte.date_from, INTERVAL 1 DAY),
      DATE_ADD(cte.date_from, INTERVAL 1 DAY),
      _du
    FROM cte 
    WHERE DATE_ADD(date_from, INTERVAL 1 DAY) < _du
)
SELECT COUNT(id), adult_fc, child_fc, date_from FROM cte
GROUP BY date_from
ORDER BY date_from

当前查询输出:

标签: mysqlrecursioncommon-table-expression

解决方案


不,这不是我想要达到的结果,例如:

1st booking 1 room 2 adult 1 Child, 2021-01-10  /  2021-01-12

2nd booking 1 room 3 adult 1 Child 2021-01-11 / 2021-01-13

结果如下:

Date               Room          Adult        Child
2021-01-10     1                 2               1
2021-01-11     2                 5               2
2021-01-12     1                 3               1

推荐阅读