Mysql 如何获取过去12个月内每个月的计数

Mysql 如何获取过去12个月内每个月的计数,mysql,sql,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 B

我目前有以下问题:

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个

下面是数据库对数据和查询的处理:

编辑:


显然,唯一受影响的一个结果是二月(当前月份),因此查询的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;
选择MONTHNAME(时间)作为月份,
年(时间)为年,
计数(id)为计数
预约
其中经销商ID='38'和
不是经销商Status“不露面”和
时间>=(CURDATE()+间隔(1天(CURDATE())天)-间隔12个月和
时间<(CURDATE()+间隔(1天(CURDATE())天)+间隔1个月
按年份(时间)、月份(时间)分组
按最大(时间)ASC订购;
我还更改了日期/时间逻辑,因此它只包括一年中的完整月份。如果希望当前月份为部分月份,可以将其更改回


是小提琴。

问题是未来的约会没有出现。您的查询过滤掉
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;
选择MONTHNAME(时间)作为月份,
年(时间)为年,
计数(id)为计数
预约
其中经销商ID='38'和
不是经销商Status“不露面”和
时间>=(CURDATE()+间隔(1天(CURDATE())天)-间隔12个月和
时间<(CURDATE()+间隔(1天(CURDATE())天)+间隔1个月
按年份(时间)、月份(时间)分组
按最大(时间)ASC订购;
我还更改了日期/时间逻辑,因此它只包括一年中的完整月份。如果希望当前月份为部分月份,可以将其更改回

是小提琴。

你的问题是:

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);
选择
月份名称(最长(时间))作为月份,
年(时间)为年,
计数(*)作为计数
预约
其中经销商ID=38
和(dealerstatus“不显示”或dealerstatus为空)
和时间>=最后一天(当前日期)+间隔1天-间隔1年
按年份(时间)、月份(时间)分组
按年度(时间)、月份(时间)排序;
(您的查询也无效。我已经完成了
GROUP BY
子句并添加了
MAX
,它最好是
任何值,但您的旧MySQL版本不支持它。我还更改了日期条件,以便不获取去年2月的天数。不知道您是否喜欢这样。)

演示:

您的问题在这里:

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);
选择
月份名称(最长(时间))作为月份,
年(时间)为年,
计数(*)作为计数
预约
其中经销商ID=38
和(dealerstatus“不显示”或dealerstatus为空)
和时间>=最后一天(当前日期)+间隔1天-间隔1年
按年份(时间)、月份(时间)分组
按年度(时间)、月份(时间)排序;
(您的查询也无效。我已经完成了
GROUP BY
子句并添加了
MAX
,它最好是
任何值,但您的旧MySQL版本不支持它。我还更改了日期条件,以便不获取去年2月的天数。不知道您是否喜欢这样。)


演示:

您正在使用哪些数据库管理系统?(此处有几个特定于产品的函数…)使用phpMyAdmin,您通常会按照与选择相同的列进行分组,但作为设置函数参数的列除外。例如,尝试
按月(时间)、按年(时间)分组。
。是的,尝试了,但仍然显示相同的结果:(同时指定预期结果。您使用的是哪种dbms?(有几个特定于产品的功能…)使用phpMyAdmin时,您通常会按
分组
选择与
相同的列,但作为设置函数参数的列除外。例如,尝试按月(时间)、年(时间)
分组。是的,尝试过,但仍然显示相同的结果:(同时指定预期结果。感谢您的建议。这也显示了2020年3月?我只希望截止到本月。这在您自己的查询中并不明显。但是,您为什么不添加该条件呢?(如果您还没有弄清楚,它是
和time
)。谢谢你的建议。这也显示了2020年3月?我只想截止到本月。从你自己的查询中看不出这一点。但是,你为什么不添加这个条件呢?(如果你还没有弄清楚,它是
和time
)。