2015-08-21 78 views
0

我有一个oder表(在MySQL数据库中)列出了订单的打开和关闭日期和时间。对于打开的订单,关闭日期和时间为空白。SQL根据打开和关闭日期确定平均值

下面是表的一个例子:

Order OPEN     CLOSED 
1  2002-06-17 18:37:27  2002-07-05 16:37:27 
2  2003-05-16 18:37:27  2003-06-28 16:37:27 
3  2004-06-15 18:37:27  2004-07-23 16:37:27 
4  2003-07-14 18:37:27  2003-07-18 16:37:27 
5  2002-08-13 18:37:27  2002-09-27 16:37:27 
6  2004-09-12 18:37:27  2005-07-19 16:37:27 
7  2005-10-11 18:37:27  2006-07-18 16:37:27 
8  2006-11-10 18:37:27  2006-12-06 16:37:27 
9  2007-12-11 18:37:27  2008-07-04 16:37:27 
10  2009-01-12 18:37:27  
11  2015-02-13 18:37:27  2015-07-17 16:37:27 

我想创建一个查询,会告诉我的天,我有未结订单的数量。然后,我想平均每个月在每月开放的数量,以便我可以查看未结订单的月份或月份趋势。

我知道我可以查询任何一天,并确定开放订单的数量,所以我可以创建一个程序,每天都会这样做,然后将每日总计插入到数据库中,然后我可以平均。

我想知道是否有一个纯粹的SQL解决方案。有没有办法用上面的表来写一个查询,结果将是按月份的平均未结订单数量?

+0

包括到目前为止你的尝试? – HaveNoDisplayName

+1

是的:https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html –

回答

1

要获取每天的订单:

SELECT COUNT(*), DATE(open) FROM orders WHERE close IS NULL GROUP BY DATE(open)

+0

这并不能解决OP问题。因为订单直到截止日期才关闭。其他日子是开放的。 –

1

首先你需要一个天表,所以你可以做一个left join

使用select Generate days from date range

这种使用存储过程中MSQL


然后,你做这样的事情

SQL Fiddle Demo

我有你的样本数据修改为一个月,因为我只制作一个月份的天表。

select day_id, count(order_id) total_open 
from 
(
    select * 
    from 
     days d left join 
     orders o 
      on d.day_value >= date(o.o_open) 
      and (
        o.o_close is null -- still open 
       or d.day_value <= o.o_close 
      ) 
    order by day_id 
) as open_byday 
group by day_id 

此,如果你关闭订单当天考虑开放日d订单。我的意思是,在你结束之前,那一天是开放了一段时间。

否则,你得改or d.day_value < o.o_close