【问题标题】:How to get count for each month for the last 12 months如何获取过去 12 个月的每个月的计数
【发布时间】:2020-05-29 06:14:08
【问题描述】:

我目前有这个查询:

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

【问题讨论】:

  • 您使用的是哪个 dbms? (那里有几个产品特定的功能......)
  • 使用 phpmyadmin
  • 您通常GROUP BY 与您SELECT 相同的列,但那些是设置函数的参数的列除外。 IE。试试GROUP BY MONTH(TIME), YEAR(time)
  • 是的尝试过,但仍然显示相同的结果:(
  • 同时指定预期结果。

标签: mysql sql


【解决方案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版本不支持它。我也更改了日期标准,以免得到去年 2 月的日期。不知道您是否喜欢这个。)

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

【讨论】:

  • 感谢您的建议。这也显示了 2020 年 3 月?我只想要当前月份。
  • 这在您自己的查询中并不明显。但是,你为什么不添加那个条件呢? (如果您还没有弄清楚,那就是AND time &lt; LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY。)。
【解决方案2】:

问题是没有显示未来的约会。您的查询过滤掉了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 是小提琴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2020-09-13
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多