【问题标题】:MySQL query to get last 12 months data grouped by month including zero countsMySQL 查询以获取按月分组的最近 12 个月数据,包括零计数
【发布时间】:2018-10-19 11:51:47
【问题描述】:

我有桌子orders (order_id, order_processed_date)。我想要过去 12 个月每月的订单数。如果任何月份有 0 个订单,那么它应该打印 0。

类似这样的:

Total Orders | Month
-----------------------
2            | OCT 2018
3            | SEP 2018
0            | AUG 2018
0            | JUL 2018
1            | JUN 2018
0            | MAY 2018
0            | APR 2018
0            | MAR 2018
5            | FEB 2018
5            | JAN 2018
0            | DEC 2017
0            | NOV 2017

我已经在这个网站上进行了搜索并得到了一些查询,但没有找到确切的解决方案。我使用以下查询得到结果,但它没有年份:

SELECT 
SUM(IF(month = 'Jan', total, 0)) AS 'Jan',
SUM(IF(month = 'Feb', total, 0)) AS 'Feb',
SUM(IF(month = 'Mar', total, 0)) AS 'Mar',
SUM(IF(month = 'Apr', total, 0)) AS 'Apr',
SUM(IF(month = 'May', total, 0)) AS 'May',
SUM(IF(month = 'Jun', total, 0)) AS 'Jun',
SUM(IF(month = 'Jul', total, 0)) AS 'Jul',
SUM(IF(month = 'Aug', total, 0)) AS 'Aug',
SUM(IF(month = 'Sep', total, 0)) AS 'Sep',
SUM(IF(month = 'Oct', total, 0)) AS 'Oct',
SUM(IF(month = 'Nov', total, 0)) AS 'Nov',
SUM(IF(month = 'Dec', total, 0)) AS 'Dec'
FROM (SELECT DATE_FORMAT(order_processed_date, '%b') AS month, 
COUNT(order_id) as total
FROM orders
WHERE order_processed_date <= NOW() and order_processed_date >= 
Date_add(Now(),interval - 12 month)
GROUP BY DATE_FORMAT(order_processed_date, '%m-%Y')) as sub

请有人帮我按我的要求给我结果。

【问题讨论】:

  • 您需要另一个主表来存储所有月份,并将其作为左连接中的第一个表。
  • @MadhurBhaiya 那几年呢?只需要存储几个月而已?
  • 您不需要仅过去 12 个月的数据吗?您可以使用YEAR(CURRENT_DATE()) 获取当前年份并将其减去 1 以获取上一年。这足以覆盖 12 个月
  • 您也可以使用select 'jan' union select 'feb' union 'mar' ...模拟月份表
  • 如果可能的话,你能给我示例查询或更新上述查询吗?

标签: mysql sql datetime group-by


【解决方案1】:

以下查询构建了前 12 个月的每月 1 日的列表。例如在Oct 19 2018 上,列表将包含从Oct 01 2018Nov 01 2017 的日期。剩下的就是左连接:

SELECT date, COUNT(orders.primary_key)
FROM (
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH AS date UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 2 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 3 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 4 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 5 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 6 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 7 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 8 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 9 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 10 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 11 MONTH UNION ALL
    SELECT LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 12 MONTH
) AS dates
LEFT JOIN orders ON order_processed_date >= date AND order_processed_date < date + INTERVAL 1 MONTH
GROUP BY date

【讨论】:

  • 完美!得到所需的数据!谢谢。
猜你喜欢
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
相关资源
最近更新 更多