SQL 创建连续日期偶数为 0
Posted
技术标签:
【中文标题】SQL 创建连续日期偶数为 0【英文标题】:SQL Create Consecutive Dates Even Count is 0 【发布时间】:2021-10-24 18:02:23 【问题描述】:我有log
表,如下所示,我想为我的图表收集log
表,我想根据category
和date
收集数据,向下滚动获取我的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 等)