2014-02-05 13 views
0

与此查询集团的MySQL结果由特定间隔

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小时的时间间隔。

例如 从00:00 - 02:00 0销售0美元 从02:00 - 04:00 3销售148,95美元

等等。

回答

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表。

要在一个小时的时间间隔报告,你看看上面的查询(与GRO​​UP 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看起来有点令人困惑,但它遵循一个简单的代码模式。

+0

令人惊叹,近乎完美。但是,我怎样才能将这个结果分成两个小时的时间间隔,因为用您的查询我可以得到当天的总销售额和总订单。 –

+1

我自己解决了它,只是增加了GROUP BY UNIX_TIMESTAMP(o.date_purchased)DIV 7200'。 –

+1

看到我的编辑显示除了UNIX_ TIMESTAMP之外的另一个解决方案 –