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

xe55xuns  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(96)

我有一个不同国家和不同产品的库存变化表。该表如下所示:
| 日期|国家|产品|变化|
| --|--|--|--|
| 2023-10-01|西班牙|笔| 1 |
| 2023-10-01|德国|笔| 1 |
| 2023-10-01|德国|笔|-1个|
| 2023- 09 -01 2023- 09 -01|意大利|笔| 1 |
| 2023-09-01 2023-09-01|意大利|笔| 5 |
| 2023-09-01 2023-09-01|德国|铅笔| 2 |
| 2023-08-01 2023-08-01|西班牙|铅笔| 1 |
我试图写一个查询mysql 8+,可以总结仓库的库存按月分组,按产品和国家。
10月和9月的结果应该是这样的:
| 日期|国家|产品|股票|
| --|--|--|--|
| 十月23|意大利|铅笔| 5 |
| 十月23|意大利|笔| 1 |
| 十月23|西班牙|铅笔| 2 |
| 十月23|西班牙|笔| 3 |
| 十月23|德国|铅笔| 2 |
| 十月23|德国|笔| 3 |
| 九月23|意大利|铅笔| 2 |
| 九月23|意大利|笔| 1 |
| 九月23|西班牙|铅笔| 4 |
| 九月23|西班牙|笔| 1 |
| 九月23|德国|铅笔| 2 |
| 九月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?
谢谢你,

hgncfbus

hgncfbus1#

这给了你什么给予?

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
如果上述内容不能给予您最终的结果,请向我们展示您的需求。

相关问题