2013-03-04 61 views
0

我有一個表,其中有兩米欄:如何在一段時間內找到mysql的日常平均值?

MARKS

CREAT_TS

我想每天平均分了兩個日期範圍(例如的startDate &結束日期)

之間

我做了以下查詢:

select SUM(MARKS)/ COUNT(date(CREAT_TS)) AS DAILY_AVG_MARKS, 

date(CREAT_TS) AS DATE 

from TABLENAME 

group by date(CREAT_TS) 

有了這個查詢,我可以得到每日平均只有在日期數據庫中有一行。但我的要求是,即使沒有排,我想在該日期顯示0。 我的意思是我希望查詢返回X行,如果有X天之間(startDate,endDate)

任何人都可以幫助我。 。:(

+0

如何定義** startDate **和** endDate **?它們是參數,'creat_ts'的MIN和MAX還是別的? – 2013-03-04 14:25:13

+1

您可能想要構建**日曆表**,然後執行** OUTER JOIN **。請參閱http://www.brianshowalter.com/calendar_tables – 2013-03-04 14:29:32

+1

請注意'AVG(標記)'也能正常工作 – Mchl 2013-03-04 14:39:01

回答

4

您需要創建一套,你可以添加到日期整數下面會給你一個想法:

select thedate, avg(Marks) as DAILY_AVG_MARKS 
from (select startdate+ interval num day as thedate 
     from (select d1.d + 10 * d2.d + 100*d3.d as num 
      from (select 0 as d union select 1 union select 2 union select 3 union select 4 union 
        select 5 union select 6 union select 7 union select 8 union select 9 
       ) d1 cross join 
       (select 0 as d union select 1 union select 2 union select 3 union select 4 union 
        select 5 union select 6 union select 7 union select 8 union select 9 
       ) d2 cross join 
       (select 0 as d union select 1 union select 2 union select 3 union select 4 union 
        select 5 union select 6 union select 7 union select 8 union select 9 
       ) d3 
      ) n cross join 
      (select XXX as startdate, YYY as enddate) const 
     where startdate + num <= enddate 
    ) left outer join 
     tablename t 
     on date(CREAT_TS) = thedate 
group by thedate 

所有的難題是創建一組連續的日期爲的如果你有一個numbers表或calendar表,那麼SQL看起來要簡單得多。

這是如何工作的?第一個大的子查詢有兩部分,第一個是通過交叉連接產生0到999之間的數字數字0-9並進行一些算術運算,第二個將它加入兩個日期startdateenddate - 您需要爲XXX和YYY輸入正確的值。有了這個表格,你就可以得到兩個值之間的所有日期。如果您需要超過999天,只需添加另一個交叉連接即可。

這是左連接到您的數據表。結果是所有的日期都出現在組中。

就報告而言,在表現層中做這件事有好處和壞處。基本上,SQL中的優勢在於報表層更簡單。報告層中的優勢在於SQL更簡單。局外人很難做出這樣的判斷。

我的建議是創建一個數字表,你可以在這樣的報告中使用它。然後查詢將會看起來更簡單,您不必更改報告層。

+0

數字表或日曆表是什麼意思? creat_ts列的數據類型? – LittleLebowski 2013-03-04 14:57:08

+0

請避免使用嵌套查詢。 – 2013-03-04 14:57:30

+0

@hilarudeens,你能提出一個更好的方法嗎? – LittleLebowski 2013-03-04 14:58:35