SQL根据打开和关闭日期确定平均值

时间:2015-08-21 19:16:24

标签: mysql sql

我有一个oder表(在MySQL数据库中)列出了订单的打开和关闭日期和时间。对于打开的订单,关闭日期和时间是空白的。

以下是该表的示例:

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解决方案。上面的表格是否有办法编写一个查询,结果是按月打开订单的平均数量?

2 个答案:

答案 0 :(得分:1)

获取每日订单:

getResponders

答案 1 :(得分: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