这是表的一部分,我从中检索过去3个月(包括本月)的数据
+-------------+-----------------------+
| Wo_id | updated_at |
+-------------+-----------------------+
| 1 | 2018-12-05 10:38:06 |
| 2 | 2018-12-02 15:21:17 |
| 3 | 2018-12-01 22:18:53 |
| 4 | 2018-10-25 10:38:06 |
| 5 | 2018-10-18 15:21:17 |
| 6 | 2018-10-16 22:18:53 |
| 7 | 2018-10-19 10:26:19 |
| 8 | 2018-10-27 07:06:52 |
| 9 | 2018-09-25 11:35:09 |
| 10 | 2018-09-18 12:54:27 |
我试过的问题是
SELECT MONTHNAME(updated_at) month,YEAR(updated_at) year_name,
MONTH(updated_at) month_no, COUNT(*) work_orders
FROM work_orders where updated_at >= last_day(now()) + interval 1 day - interval 3 month
GROUP by MONTH(updated_at),YEAR(updated_at)
ORDER BY MONTH(updated_at) DESC
我得到的结果是
+-------------+-------------+----------+-------------+
| month | year_name | month_no | work_orders |
+-------------+-------------+----------+-------------+
| December | 2018 | 12 | 3 |
| October | 2018 | 10 | 5 |
| September | 2018 | 9 | 2 |
如您所见,查询忽略了十一月,因为它的数据不在表中。它包括 September
为了完成3个月的周期这是错误的。我想要这样的输出
+-------------+-------------+----------+-------------+
| month | year_name | month_no | work_orders |
+-------------+-------------+----------+-------------+
| December | 2018 | 12 | 3 |
| November | 2018 | 9 | 0 |
| October | 2018 | 10 | 5 |
有人能指导我修改上述查询吗。谢谢
1条答案
按热度按时间7dl7o3gd1#
您需要创建一个过去三个月的表,然后
LEFT JOIN
将其添加到工作订单表(使用工作订单的月份)以获得所需的结果。可以使用UNION
:产量(截至2018-12-07):
请注意,从日期中减去1个月是可以的,因为如果天数大于上个月的天数,则会向下调整以使日期有效(请参阅手册)。
最后的查询变成:
请注意,我们不需要
WHERE
子句中的值month
表将数据限制为我们感兴趣的最近3个月。我们还使用LEFT JOIN
所以我们每个月都会得到一个结果,即使那个月没有工作单。输出:
在dbfiddle上演示