SQL 创建连续日期偶数为 0

Posted

技术标签:

【中文标题】SQL 创建连续日期偶数为 0【英文标题】:SQL Create Consecutive Dates Even Count is 0 【发布时间】:2021-10-24 18:02:23 【问题描述】:

我有log 表,如下所示,我想为我的图表收集log 表,我想根据categorydate 收集数据,向下滚动获取我的sql 代码

id category date
2 penghapusan 2021-08-24 08:23:24
3 penghapusan 2021-08-24 08:24:53
4 penerimaan 2021-08-24 08:27:57
5 penerimaan 2021-08-24 08:28:07
6 penerimaan 2021-08-26 08:31:54
7 penolakan 2021-08-24 08:34:27
8 penolakan 2021-08-24 08:36:16
9 penolakan 2021-08-25 08:38:13
10 penolakan 2021-08-25 08:40:00
11 penolakan 2021-08-25 08:40:13
12 penolakan 2021-08-25 08:41:20
13 pengiriman 2021-08-24 08:41:53
14 penolakan 2021-08-24 08:42:13
15 pengiriman 2021-08-24 08:42:28
16 penerimaan 2021-08-26 08:42:35
17 pengiriman 2021-08-25 08:43:00
18 penerimaan 2021-08-26 08:43:06
19 penerimaan 2021-08-27 08:43:06
20 pengiriman 2021-08-25 08:43:31
21 penolakan 2021-08-24 08:43:37
22 penolakan 2021-08-24 08:43:37
23 pengiriman 2021-08-26 08:44:06
24 penolakan 2021-08-24 08:44:15
25 penolakan 2021-08-24 08:44:15
26 pengiriman 2021-08-26 08:47:36
27 penolakan 2021-08-24 08:47:41
28 pengiriman 2021-08-28 08:48:07
29 penerimaan 2021-08-27 08:48:11
30 pengiriman 2021-08-28 08:48:16
31 penerimaan 2021-08-27 08:48:20
32 penghapusan 2021-08-24 08:48:44
33 pengubahan 2021-08-24 08:48:51
34 pengubahan 2021-08-24 08:49:01
35 penghapusan 2021-08-24 08:49:13
36 penghapusan 2021-08-24 08:52:32
37 pembuatan 2021-08-24 08:52:50
38 pembuatan 2021-08-24 08:53:39

这是我的代码,我使用 count 来收集所有类别数据并按类别和日期分组(没有时间)

SELECT category, COUNT(category) as total, CAST(date AS DATE) as date
FROM log
GROUP BY category, CAST(date AS DATE)
ORDER BY category ASC
LIMIT 100

下面这段代码的结果

category total date
pembuatan 2 8/24/2021
pengiriman 2 8/24/2021
pengiriman 2 8/25/2021
pengiriman 2 8/26/2021
pengiriman 2 8/28/2021
penerimaan 2 8/24/2021
penerimaan 3 8/26/2021
penerimaan 3 8/27/2021
penolakan 8 8/24/2021
penolakan 4 8/25/2021
penghapusan 5 8/24/2021
pengubahan 2 8/24/2021

好吧,实际上我的代码很好用。但是,如果您检查每个类别的日期顺序,就会有一个错过的日期(检查 penerimaan,没有 8/25/2021),我的问题是,有没有办法克服错过的日期?所以仍然会打印一个日期,但 total 为 0,就像我在下面创建的预期表一样

category total date
pembuatan 2 8/24/2021
pembuatan 0 8/25/2021
pembuatan 0 8/26/2021
pembuatan 0 8/27/2021
pembuatan 0 8/28/2021
pengiriman 2 8/24/2021
pengiriman 2 8/25/2021
pengiriman 2 8/26/2021
pengiriman 0 8/27/2021
pengiriman 2 8/28/2021
penerimaan 2 8/24/2021
penerimaan 0 8/25/2021
penerimaan 3 8/26/2021
penerimaan 3 8/27/2021
penerimaan 0 8/28/2021
penolakan 8 8/24/2021
penolakan 4 8/25/2021
penolakan 0 8/26/2021
penolakan 0 8/27/2021
penolakan 0 8/28/2021
penghapusan 5 8/24/2021
penghapusan 0 8/25/2021
penghapusan 0 8/26/2021
penghapusan 0 8/27/2021
penghapusan 0 8/28/2021
pengubahan 2 8/24/2021
pengubahan 0 8/25/2021
pengubahan 0 8/26/2021
pengubahan 0 8/27/2021
pengubahan 0 8/28/2021

在我的期望表中,每个类别都将获得与其他类别相同的总体日期,但如果这似乎不可能,那么创建一个新的“刚刚跳过”的日期怎么样?与没有日期 2021 年 8 月 25 日的“penerimaan”类别一样。 这可能吗?

对不起,长桌,谢谢

【问题讨论】:

您使用的是 mysql 还是 MS SQL Server? (它们的日期/时间函数不兼容...) 我删除了冲突标签,请标记您实际使用的数据库。 我正在使用 MySQL @jarlh,但它的工作,使用 phpMyAdmin (xampp) 这是日历表运行良好的时候。 @Larnu 嘿,您的评论对我帮助不大,谢谢,我按照此 url ubiq.co/database-blog/fill-missing-dates-in-mysql 的步骤操作,但我的查询不起作用,对于该 url 中的那个表和日历表,你认为我的查询对吗? SELECT l.category, IFNULL(COUNT(l.category), 0) AS total, c.datefield AS tanggal FROM calendar c LEFT JOIN log l ON c.datefield=CAST(l.date AS DATE) GROUP BY l.category, c.datefield ORDER BY l.category ASC LIMIT 100 我尝试创建/编辑这个/新问题,以使我的问题更清楚 【参考方案1】:

您需要将不同类别的 CROSS 连接到不同的日期,然后将 LEFT 连接到 log 以聚合所有现有日期:

SELECT c.category, 
       COUNT(l.id) total,  
       d.date
FROM (SELECT DISTINCT category FROM log) c
CROSS JOIN (SELECT DISTINCT DATE(date) date FROM log) d
LEFT JOIN log l ON l.category = c.category AND DATE(l.date) = d.date
GROUP BY c.category, d.date
ORDER BY c.category ASC
LIMIT 100;

请注意,如果表格中缺少所有类别的日期,则该日期不会显示在结果中,所有类别的日期均为 0。

请参阅demo。

【讨论】:

以上是关于SQL 创建连续日期偶数为 0的主要内容,如果未能解决你的问题,请参考以下文章

在今天的日期之后生成具有偶数天的 n 个连续日期(例如,对于 2020-06-08,它将是 2020-06-10、2020-06-12、2020-06-14 等)

SQL Server连续日期 - 将多行汇总为连续的开始和结束日期行,而不包含CTE,循环,... s

sql server 生成连续日期

我们如何在 SQL 中将连续数据分组为单个日期跨度?

如何通过SQL生成一个包含连续日期的临时表

SQL经典问题 找出连续日期及连续的天数