在 SQL 中计算有间隙的分区的累积和

问题描述 投票:0回答:1

我有一张表,其中包含不同国家和不同产品的库存变化。 该表如下所示:

日期 国家 产品 变化
2023-10-01 西班牙 1
2023-10-01 德国 1
2023-10-01 德国 -1
2023-9-01 意大利 1
2023-09-01 意大利 5
2023-09-01 德国 铅笔 2
2023-08-01 西班牙 铅笔 1

我正在尝试在 mysql 8+ 上编写一个查询,可以汇总按月份、按产品和按国家分组的仓库库存。

十月和九月的结果应该是这样的:

日期 国家 产品 库存
10 月 23 日 意大利 铅笔 5
10 月 23 日 意大利 1
10 月 23 日 西班牙 铅笔 2
10 月 23 日 西班牙 3
10 月 23 日 德国 铅笔 2
10 月 23 日 德国 3
9 月 23 日 意大利 铅笔 2
9 月 23 日 意大利 1
9 月 23 日 西班牙 铅笔 4
9 月 23 日 西班牙 1
9 月 23 日 德国 铅笔 2
9 月 23 日 德国 3

问题在于,某些国家或某些产品存在差距,不允许我用分区执行简单的累加和。 例如:

SELECT
Date,
Product,
Country,
SUM(SUM(variation)) OVER (PARTITION BY Product, Country ORDER BY Date)
FROM mytable
GROUP BY Date,Country,Product

我能想到的唯一解决方案是创建一个在日期上循环的过程并计算每个循环的总数,是否有其他更有效的解决方案来避免差距?也许使用递归 CTE ?

谢谢你,

mysql loops common-table-expression recursive-cte
1个回答
0
投票

这给了你什么?

SELECT  DATE_FORMAT(DATE, "%M-%y"),
        Product,
        Country,
        SUM(variation) AS sum_v
    FROM  mytable
    WHERE Date >= '2023-09-01'
      AND Date  < '2023-09-01' + INTERVAL 2 MONTH
    GROUP BY  Date, Country, Product 

我不明白有间隙的问题。

正如 Akina 指出的那样,带有包含所有日期的表的

LEFT JOIN
将为您提供没有数据的日子的 NULL。
IFNULL()
COALESCE()
然后可以将
NULL
变成
0

如果以上没有给您最终结果,请告诉我们您需要什么。

© www.soinside.com 2019 - 2024. All rights reserved.