首页 > 解决方案 > 如何获取过去 12 个月的每个月的计数

问题描述

我目前有这个查询:

SELECT
    MONTHNAME(TIME) AS month, 
    YEAR(time) AS year, 
    COUNT(id) AS COUNT
FROM
    appointment
WHERE
    dealershipid = '38' && dealerstatus != 'No-Show' && TIME >= DATE_ADD(NOW(), INTERVAL - 12 MONTH)
GROUP BY
    MONTH(TIME)
ORDER BY
    `time` ASC

这意味着返回过去 12 个月内每个月的约会记录总数(滚动 12 个月,而不是 1-12,可能是 2 月 19 日至 3 月 20 日)

这是它实际返回的内容:

+-----------+------+-------+--+
|   month   | year | COUNT |  |
+-----------+------+-------+--+
| July      | 2019 |     1 |  |
| August    | 2019 |     2 |  |
| September | 2019 |     8 |  |
| October   | 2019 |     9 |  |
| November  | 2019 |    15 |  |
| December  | 2019 |     2 |  |
| January   | 2020 |     4 |  |
| February  | 2020 |     2 |  |
+-----------+------+-------+--+

我认为一切都很好而且花花公子,但是(例如)2020 年 2 月实际上有 13 个约会,而不是所述的 2 个。

这是一个包含数据和查询的数据库:

https://www.db-fiddle.com/f/pndaShANmnLZRXxNNe3GPk/1

编辑:

显然,唯一受影响的一个结果是 2 月(当前月份),因此查询的 NOW() 函数没有得到整个月份,而是现在之前的任何内容。

标签: mysqlsql

解决方案


问题是没有显示未来的约会。您的查询会过滤掉NULL值。

试试这个:

SELECT MONTHNAME(time) AS month, 
       YEAR(time) AS year, 
       COUNT(id) AS COUNT
FROM appointment
WHERE dealershipid = '38' AND
      not dealerstatus <=> 'No-Show' AND
      time >= (CURDATE() + INTERVAL (1 - DAY(CURDATE())) DAY) - INTERVAL 12 MONTH AND
      time < (CURDATE() + INTERVAL (1 - DAY(CURDATE())) DAY) + INTERVAL 1 MONTH       
GROUP BY YEAR(Time), MONTH(time)
ORDER BY MAX(time) ASC;

我还更改了日期/时间逻辑,因此它只包括一年中的完整月份。如果您希望当前月份不完整,您可以将其更改回来。

是小提琴。


推荐阅读