【问题标题】:Monthly Count In MySQLMySQL中的每月计数
【发布时间】:2022-01-18 16:58:32
【问题描述】:

我打算每月进行一次 COUNT。
我想统计从现在到15个月前的数据。我希望在没有数据的月份将其标记为0。

这是我的桌子

人果

Id Fruit People CreatedAt
1 Apple John 2020-11-13
2 Banana Katie 2020-11-25
3 Kiwi Sam 2021-03-03
4 Apple Katie 2021-04-12
5 Apple Katie 2021-04-24
6 Apple John 2021-04-30
7 Banana Sam 2021-09-02
8 Banana Katie 2021-11-11
9 Apple Sam 2021-12-12
10 Kiwi John 2021-12-15

我想按月知道水果 COUNT,以免人们重叠。
ex)如果你在 4 月(第 4 个月)看 Apple,Katie 选择了两次,John 选择了一次,但是因为 Katie 重叠,COUNT 变成了 2。

我使用了这个查询。

SELECT DATE_FORMAT(createdAt,'%y.%m') m, COUNT(DISTINCT(People)) as count
FROM  PeopleFruit
WHERE createdAt > DATE_ADD(NOW(),INTERVAL - 15 MONTH)
  AND Fruit = 'Apple'
GROUP BY m;

结果是

m count
20.11 1
21.04 2
21.12 1

但这就是我想要的结果。

m count
21.12 1
21.11 0
21.10 0
21.09 0
21.08 0
21.07 0
21.06 0
21.05 0
21.04 2
21.03 0
21.02 0
21.01 0
20.12 0
20.11 1
20.10 0

我该怎么办?

【问题讨论】:

  • 但这是我想要的结果。 生成基准年月表,然后左连接您的数据表和组。
  • DISTINCT 不是一个函数,它是一个set quantifer。去掉那些多余的括号,直接写COUNT(DISTINCT People) as count,让代码更清晰!
  • 你的 MySQL 版本?

标签: mysql sql group-by count


【解决方案1】:

从 MySQL 8.0 开始,您可以使用 RECURSIVE CTE 之类的:

WITH RECURSIVE months(m) AS (
    SELECT DATE_FORMAT(NOW(),'%Y-%m-01') m
    UNION ALL
    SELECT DATE_SUB(m, INTERVAL 1 MONTH) m FROM months
    WHERE m > DATE_SUB(NOW(), INTERVAL 15 MONTH)
) SELECT 
    DATE_FORMAT(months.m,'%y.%m') m,
    COALESCE(count, 0)  count
FROM months
NATURAL LEFT JOIN (
  SELECT DATE_FORMAT(createdAt,'%Y-%m-01') m, COUNT(DISTINCT(People)) as count
  FROM  PeopleFruit
  WHERE createdAt > DATE_ADD(NOW(),INTERVAL - 15 MONTH) AND Fruit = 'Apple'
  GROUP BY m
) months_count ;

MySQL recursive CTE test

【讨论】:

  • 谢谢。它工作得很好。你是个天才。能解释一下原理吗?
猜你喜欢
  • 2014-08-21
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多