繁体   English   中英

SQL/MySQL:按日期将数量值拆分为多行

[英]SQL/MySQL: split a quantity value into multiple rows by date

我有一个包含三列的表: planning_start_date - planning_end_date - quantity

例如我有这个数据:

 planning_start_date | planning_end_date | quantity
          2019-03-01 |        2019-03-31 |     1500

我需要将值 1500 分成多行,每天平均,所以 1500 / 31 天 = 48,38 天。

预期的结果应该是:

date         daily_qty
2019-03-01 |     48,38
2019-03-02 |     48,38
2019-03-03 |     48,38
...
2019-03-31 |     48,38

有人有一些建议吗?

如果您决定升级到 MySQL 8.0,这里有一个递归 CTE,它将生成一个包含planning_start_dateplanning_end_date之间所有天数以及所需的每日数量的列表:

WITH RECURSIVE cte AS (
    SELECT planning_start_date AS date, 
           planning_end_date, 
           quantity / (DATEDIFF(planning_end_date, planning_start_date) + 1) AS daily_qty
    FROM test
    UNION ALL
    SELECT date + INTERVAL 1 DAY, planning_end_date, daily_qty
    FROM cte
    WHERE date < planning_end_date
)
SELECT `date`, daily_qty
FROM cte
ORDER BY `date`

dbfiddle 上的演示

在 MySLQ 8+ 中,您可以使用这样的递归 CTE:

with recursive cte(dte, planning_end_date, quantity, days) as (
      select planning_start_date as dte, planning_end_date, quantity, datediff(planning_end_date, planning_start_date) + 1 as days
      from t
      union all
      select dte + interval 1 day as dte, planning_end_date, quantity, days
      from cte
      where dte < planning_end_date
     )
select dte, quantity / days
from cte;

是一个 db<>fiddle。

在早期版本中,您需要某种数字表。 例如,如果您的表有足够的行,您可以使用它:

select (planning_start_date + interval n.n day),
       quantity / (datediff(planning_end_date, planning_start_date) + 1)
from t join
     (select (@rn := @rn + 1) as n
      from t cross join
           (select @rn := 0) params
     ) n
     on planning_start_date + interval n.n day <= planning_end_date;

您可以使用任何足够大的表来容纳n

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM