mysql - 如何获取过去 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() 函数没有得到整个月份,而是现在之前的任何内容。
解决方案
问题是没有显示未来的约会。您的查询会过滤掉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;
我还更改了日期/时间逻辑,因此它只包括一年中的完整月份。如果您希望当前月份不完整,您可以将其更改回来。
这是小提琴。
推荐阅读
- php - 在 Laravel 5 中使用数据表
- tensorflow - Keras 和 make_csv_dataset 兼容性
- python-requests - 如何在 PACT Json Generation 中发送授权详细信息或在 PACT PYTHON 中发送验证器
- c++ - 没有格式说明符的c ++中的printf之类的实用程序?
- javascript - 在 WebSocket 中获取服务器响应
- stored-procedures - 当字符超过 32K 时 Oracle XMLAGG 不起作用
- angularjs - 如何将 jspanel4 与 angular 1.x 一起使用?
- android - 在后按时调用 notifyDataSetChanged
- angular - Angular:导航后获取原点
- sql - 如何使用 Bulk collect/FORALL 优化 PL/SQL 代码?