MYSQL组统计信息按统计信息的两个日期范围

时间:2015-07-23 12:56:48

标签: mysql group-by statistics

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

实际上,我要显示两个日期范围内的所有“销售额”(订单数量和总金额)。

我使用以下查询:

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"

适用于该系列。现在我想像我想要的那样放大“范围的所有日子”,“范围的所有日子”

例如,该范围的所有日子:

  • | 2015-07-01 | 0 | 0 |
  • | 2015-07-02 | 1 | 3000 |
  • ...
  • | 2015-08-20 | 3 | 450 |

例如,对于该范围的所有月份:

  • | 2015-07-01 | 40 | 15200 |
  • | 2015-08-01 | 23 | 3890 |

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

我知道有很多不同的方法可以达到我想要的结果......但有一次,我想用MySQL做一件干净的事情,有点“专业”。

美好的一天

1 个答案:

答案 0 :(得分:1)

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

您可能想要一些应用程序代码将结果呈现为某种类型的表格或图表,并且我会花费三次调用的开销。

我按如下方式运行查询:

  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

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