MYSQL 按两个日期范围对统计信息进行分组以进行统计

MYSQL group stats by range of two dates for statistics

我尝试在我的应用程序中实现一些统计信息。

实际上我想要显示两个日期范围内的所有 "sales"(订单数量和总金额)。

我使用以下查询:

SELECT COUNT(order.id), SUM(order.total_amount) FROM `order` WHERE payed_at BETWEEN "2015-07-01 00:00:00" AND "2015-08-25 00:00:00"

它适用于范围。现在我想缩放,就像我想按 "all days of the range"、"all monthes of the range"

分组一样

例如范围内的所有天数:

例如范围内的所有月份:

是否可以使用相同的查询执行该操作,只需添加类似 "GROUP BY" 的内容?

我知道有很多不同的方法可以达到我想要的结果...但是有一次,我想用 MySQL 做一些干净的事情,有点 "professional".

美好的一天

您可以使用 UNION ALL 做一些时髦的事情,但我可能会将这三个查询分开。

无论如何,您可能需要一些应用程序代码将结果呈现为 table 或某种图形,我将承担三个调用的开销。

我运行查询如下:

  SELECT COUNT(order.id), 
         SUM(order.total_amount) 
    FROM `order` 
   WHERE payed_at >= :start_date 
     AND payed_at <  :end_date + INTERVAL 1 DAY

  SELECT DATE(payed_at) payed_date
         COUNT(order.id), 
         SUM(order.total_amount) 
    FROM `order` 
   WHERE payed_at >= :start_date 
     AND payed_at <  :end_date + INTERVAL 1 DAY
GROUP BY payed_date

  SELECT EXTRACT(YEAR_MONTH FROM payed_at) payed_year_month
         COUNT(order.id), 
         SUM(order.total_amount) 
    FROM `order` 
   WHERE payed_at >= :start_date 
     AND payed_at <  :end_date + INTERVAL 1 DAY
GROUP BY payed_year_month

在查询包含 BETWEEN 的日期范围时,我更喜欢 >=/< 的确切逻辑。

按月分组时,如果范围可以跨越一年,请务必记住也包括年份。 EXTRACT 的替代方法包括 LAST_DAYDATE_FORMAT.. 请参阅 MySQL Date and Time Functions.

另一种选择是仅 运行 第二个查询(按日期分组)并在应用程序代码中汇总月份和范围总计。