我有一个基于日期的项目表,其中许多项目在月和年之间有间隔。例如,如果一月份创建了一个帖子,四月份创建了五个,那么我在二月、三月、五月和六月都会有空白。我四处搜索,发现要做的一件事是使用一个数字表,或者创建一个临时的月份表,并将其连接起来,但我似乎仍然无法让它工作。以下是我目前掌握的情况:
CREATE OR REPLACE TABLE temp_months (id INT unsigned PRIMARY KEY);
INSERT INTO temp_months
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12);
SELECT
COUNT(p.ID) AS COUNT,
YEAR(p.created_date) as YEAR,
tm.id as MONTH
FROM
temp_months tm
LEFT OUTER JOIN
my_table p
ON
MONTH(p.created_date) = tm.id
WHERE
p.company_id = 123456
GROUP BY
MONTH, YEAR
ORDER BY
p.created_date DESC
这给了我以下格式,带有间隙(几乎就像我根本没有将它连接到temp表一样)
+-------+------+-------+
| COUNT | YEAR | MONTH |
+-------+------+-------+
| 1 | 2020 | 5 |
| 3 | 2020 | 2 |
| 1 | 2020 | 1 |
| 9 | 2019 | 10 |
| 2 | 2019 | 8 |
+-------+------+-------+
我想让它做的是用一个空的/null/0来填补空白 COUNT
,例如:
+-------+------+-------+
| COUNT | YEAR | MONTH |
+-------+------+-------+
| NULL | 2020 | 6 |
| 1 | 2020 | 5 |
| NULL | 2020 | 4 |
| NULL | 2020 | 3 |
| 3 | 2020 | 2 |
| 1 | 2020 | 1 |
| NULL | 2019 | 12 |
| NULL | 2019 | 11 |
| 9 | 2019 | 10 |
| NULL | 2019 | 9 |
| 2 | 2019 | 8 |
| NULL | 2019 | 7 |
+-------+------+-------+
我只是不太清楚我把事情搞砸了。
3条答案
按热度按时间rmbxnbpk1#
您可以尝试更改temp\u months表,将年份包括在内,如下所示:
假设你的table是这样的,
您可以运行这种查询:
结果将是
如果要显示null,可以使用:
结果将是
例子:https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=2ee3594614494d3397a996d7ff815859
要手动但快速地填充temp\u months表,我输入一年值,如下所示:
然后,我将其复制到文本编辑器中,查找/替换2019到2020,然后再次执行…以此类推。几秒钟之内,我就可以在临时表格里找到几年的数据了。
另一个选项是创建一个存储过程,根据这里的示例按需填充它:如何用日期范围填充表?
hgncfbus2#
下面的查询将为您提供最后一个
n
月,使用递归cte生成上一个月的年/月组合n
几个月之后LEFT JOIN
将这些值my_table
获取每年/每月组合的计数。此查询是为过去12个月设置的(11
在cte的递归部分),更改为24
您可以将该值更改为23
.输出(对于@zedfoxus示例数据):
在dbfiddle上演示
该查询从表中的最大日期开始运行,要从当前日期开始运行,请按如下所示更改递归cte:
在dbfiddle上演示
cgfeq70w3#
假设你用的是mariadb。。。
而不是乱七八糟的
UNIONs
,使用seq_0_to_100
以及+ INTERVAL sea MONTH
.