MySQL:为范围内的所有日期创建运行总和?

bjg7j2ky  于 2023-01-04  发布在  Mysql
关注(0)|答案(1)|浏览(130)

我有一个表Service,它存储了销售记录和导致销售的推荐类型。我需要知道给定的推荐类型在一个日期范围内产生的销售总数。Service中的相关数据如下所示:

+------+-------+------------+
| uuid | sr_id | s_saledate |
+------+-------+------------+
|      |     1 | 2020-01-01 |
|      |     1 | 2020-01-01 |
|      |     2 | 2021-01-01 |
|      |     2 | 2021-01-01 |
|      |     1 | 2021-01-01 |
+------+-------+------------+

我想计算给定日期范围内每种推荐类型(sr_id)的销售数量。
如果我的日期范围是2020-01-01到2021-01-01,我的输出应该如下所示:

+------+-------+------------+----------------------+
| uuid | sr_id | date       | num_sales_as_of_date
+------+-------+-----------------------------------+
|      |     1 | 2020-01-01 | 2                    |
|      |     1 | 2020-01-02 | 2                    |
|      |     1 | 2020-01-03 | 2                    |
........................................................ < many rows for days in range 
             1   2021-01-01 | 3
|      |     2 | 2020-01-01 | 0                    |
|      |     2 | 2020-01-02 | 0                    |
........................................................ < many rows for days in range 
|      |     2 | 2020-01-01 | 2                    |
+------+-------+-----------------------------------+

在该范围内的每个日期,每种推荐类型都应占一行。
现在,我的查询如下所示:

SELECT s.sr_id,
       s.s_saledate               AS date,
       Count(s.uuid)
         OVER (
           partition BY s.sr_id
           ORDER BY s.s_saledate) AS num_sales_as_of_date
FROM   Service s

如何获取没有具有特定转诊类型ID的服务的日期中每个转诊类型的累计金额?编辑以进行澄清
例如,在我给予的第一个表中,“服务”表中没有sr_id = '1'且s_saledate ===“2020-01-02”的“服务”行。有两行来自前几天,其中sr_id = '1'.(2020-01-01)。“2020-01-02”的输出行为:

sr_id  date       num_sales_as_of_date 
  1 | 2020-01-02 | 2                  |
enyaitl3

enyaitl31#

您需要从包含该范围内所有日期的表和包含所有推荐类型的表左联接“服务”表,以便获得包含每个日期和推荐类型组合的行:

WITH RECURSIVE dates AS (
    SELECT date('2020-01-01') AS date
    UNION ALL
    SELECT dates.date + INTERVAL 1 DAY
    FROM dates
    WHERE dates.date <= '2020-01-05'
)
SELECT ServiceReferral.sr_id,
       dates.date,
       Count(s.uuid)
         OVER (
           partition BY ServiceReferral.sr_id
           ORDER BY dates.date) AS num_sales_as_of_date
FROM dates
CROSS JOIN ServiceReferral
LEFT JOIN Service s ON s.s_saledate=dates.date AND s.sr_id=ServiceReferral.sr_id

fiddle
如果您经常这样做,那么创建一个包含从0000-01-01到9999-12-31的所有日期的实际表dates并使用它(在where子句中选择所需范围内的日期)可能会更方便。

相关问题