按特定间隔对MySql-Result进行分组

时间:2014-02-05 20:51:37

标签: php mysql sql

使用此查询

SELECT ROUND(COALESCE(SUM(IF(DATE(o.date_purchased) = current_date, ot.value, null)), 0), 2) AS today
FROM   orders o 
JOIN   orders_total ot on ot.orders_id = o.orders_id 
WHERE  ot.class = 'ot_total'

我获得了当天的销售额。

“date_purchased”列的日期时间为类型。

我如何计算当天的订单或我是否需要第二次查询? 我怎么能将销售分组为2小时。

e.g。 从00:00 - 02:00 0销售0美元 从02:00 - 04:00 3销售148,95美元

等等。

1 个答案:

答案 0 :(得分:2)

这很简单,可以非常有效地完成。

要获取当天的订单和销售总额,请执行以下操作:

SELECT DATE(o.date_purchased) AS date_purchased,
       SUM(ot.value) AS sales_today,
       COUNT(*)      AS orders_today
  FROM orders AS o
  JOIN orders_total AS ot ON ot.orders_id = o.orders_id 
 WHERE ot.class = 'ot_total'
  AND o.date_purchased >= CURRENT_DATE()
  AND o.date_purchased <  CURRENT_DATE() + INTERVAL 1 DAY
GROUP BY DATE(ot.value)

注意:我不明白你的订单和orders_total表所以我猜了一下。

要报告一小时的间隔,请查看上面的查询(使用GROUP BY),然后替换

DATE(ot.value) + INTERVAL HOUR(ot.value) HOUR

表示发生DATE(ot.value)的两个地方。该表达式获取每个时间戳并将其转换为最近一小时的时间戳。例如,它会将2014-01-01 11:15:22变为2014-01-01 11:00。按照该值进行分组时,您可以获得所需的内容。

您要做的是报告两小时的间隔。要做到这一点,你需要一个表达式,它接受每个时间戳并将其转换为最近两小时间隔的时间戳。例如,您需要将2014-01-01 11:15:22变为2014-01-01 10:00。所以,我们需要提出一个表达式来做到这一点。这里是。这是一个约会算术魔术。

DATE(ot.value) + INTERVAL (HOUR(ot.value) - HOUR(ot.value) MOD 2) HOUR

因此,您的两小时摘要查询如下所示。

SELECT DATE(o.date_purchased)  
              + INTERVAL (HOUR(o.date_purchased) 
              - HOUR(o.date_purchased) MOD 2) HOUR AS time_purchased,
       SUM(ot.value) AS sales_today,
       COUNT(*)      AS orders_today
  FROM orders AS o
  JOIN orders_total AS ot ON ot.orders_id = o.orders_id 
 WHERE ot.class = 'ot_total'
  AND o.date_purchased >= CURRENT_DATE()
  AND o.date_purchased <  CURRENT_DATE() + INTERVAL 1 DAY
GROUP BY DATE(o.date_purchased)  
              + INTERVAL (HOUR(o.date_purchased) 
              - HOUR(o.date_purchased) MOD 2) HOUR

有关如何更一般地执行此时间间隔报告的说明,请参阅此处。 http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/这种SQL看起来有点令人困惑,但它遵循简单的代码模式。