如何获得最近12个月的每个月计数

时间:2020-02-13 13:54:37

标签: mysql sql

我目前有这个查询:

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,可能是Feb19-Mar20)

这实际上是返回的内容:

+-----------+------+-------+--+
|   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()函数不会获取整个月,而不是现在之前的任何内容。

2 个答案:

答案 0 :(得分:1)

问题是将来的约会没有演出。您的查询会过滤出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;

我还更改了日期/时间逻辑,因此它仅包含一年中的完整月份。如果希望当前月份为部分月份,则可以改回。

Here是小提琴。

答案 1 :(得分:1)

您的问题在这里:

dealerstatus != 'No-Show'

这不包括其他经销商状态和空值

你想要

(dealerstatus != 'No-Show' OR dealerstatus IS NULL)

相反。

完整的更正查询:

SELECT
  MONTHNAME(MAX(time)) AS month,
  YEAR(time) AS year,
  COUNT(*) AS count
FROM appointment
WHERE dealershipid = 38
  AND (dealerstatus <> 'No-Show' OR dealerstatus IS NULL)
  AND time >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 YEAR
GROUP BY YEAR(time), MONTH(time)
ORDER BY YEAR(time), MONTH(time);

(您的查询也无效。我已经完成了GROUP BY子句并添加了MAX,最好是ANY_VALUE,但是您的旧MySQL版本不支持它。我还更改了日期标准,以免获得上月的日期。不知道您是否愿意。

演示:https://www.db-fiddle.com/f/oaPmSTMuzzUDnHtMG2Jxhz/0