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
)。