计算Mysql中打开商品的每月库存

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

我很难回答这个问题,提前感谢您的帮助!

给定一组具有打开和关闭日期的项目,我需要计算每个月打开的项目的数量(所有项目在月底之前尚未关闭)

我在下面附上一个带有一些日期的示例,期望的结果看起来像这样

库存
2012 年 9 月 0
2012 年 10 月 4
2012 年 11 月 4
2012 年 12 月 2
2013 年 1 月 3
2013 年 2 月 0
2013 年 3 月 0

我用这个例子创建了一个小提琴 https://www.db-fiddle.com/f/kBFviS9ZjMWdXR8aeZ3bDk/1

我正在使用 Mysql 5.7.44-日志 ONLY_FULL_GROUP_BY 已禁用

CREATE TABLE TestDate (
    Objectid int,
    OpenDate date NULL,
    CloseDate date NULL
);

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(1, '2013-02-18 00:00:00', '2013-02-19 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(2, '2013-01-22 00:00:00', '2013-01-28 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(3, '2012-10-17 00:00:00', '2013-02-01 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(4, '2012-10-28 00:00:00', '2012-12-14 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(5, '2013-01-16 00:00:00', '2013-02-02 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(6, '2013-01-20 00:00:00', '2013-01-25 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(7, '2012-11-25 00:00:00', '2012-12-04 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(8, '2012-10-20 00:00:00', '2013-02-04 00:00:00');

INSERT INTO TestDate(Objectid, OpenDate, CloseDate) 
    VALUES(9, '2012-10-31 00:00:00', '2012-11-15 00:00:00');

我尝试了很多来自 stackoverflow 的不同想法的方法,但它们似乎都没有创造出预期的结果

mysql
1个回答
0
投票

此示例使用派生表

seq
中的序列生成派生表
months
中每月最后几天的列表,然后连接到您的
TestDate
表。

SELECT DATE_FORMAT(months.eom, '%b %Y') AS Month, COUNT(td.Objectid) AS Stock
FROM (
    SELECT LAST_DAY('2012-09-01' + INTERVAL seq.n MONTH) AS eom
    FROM (SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
          SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) seq
) months
LEFT JOIN TestDate td ON months.eom >= td.OpenDate
                     AND (months.eom < td.CloseDate OR td.CloseDate IS NULL)
GROUP BY months.eom;

这是一个db<>小提琴

如果您不需要考虑没有设置

CloseDate
的情况,那么您可以删除
OR td.CloseDate IS NULL

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