我很难回答这个问题,提前感谢您的帮助!
给定一组具有打开和关闭日期的项目,我需要计算每个月打开的项目的数量(所有项目在月底之前尚未关闭)
我在下面附上一个带有一些日期的示例,期望的结果看起来像这样
月 | 库存 |
---|---|
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 的不同想法的方法,但它们似乎都没有创造出预期的结果
此示例使用派生表
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
。