2015-08-21 52 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