您需要創建一套,你可以添加到日期整數下面會給你一個想法:
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並進行一些算術運算,第二個將它加入兩個日期startdate
和enddate
- 您需要爲XXX和YYY輸入正確的值。有了這個表格,你就可以得到兩個值之間的所有日期。如果您需要超過999天,只需添加另一個交叉連接即可。
這是左連接到您的數據表。結果是所有的日期都出現在組中。
就報告而言,在表現層中做這件事有好處和壞處。基本上,SQL中的優勢在於報表層更簡單。報告層中的優勢在於SQL更簡單。局外人很難做出這樣的判斷。
我的建議是創建一個數字表,你可以在這樣的報告中使用它。然後查詢將會看起來更簡單,您不必更改報告層。
如何定義** startDate **和** endDate **?它們是參數,'creat_ts'的MIN和MAX還是別的? – 2013-03-04 14:25:13
您可能想要構建**日曆表**,然後執行** OUTER JOIN **。請參閱http://www.brianshowalter.com/calendar_tables – 2013-03-04 14:29:32
請注意'AVG(標記)'也能正常工作 – Mchl 2013-03-04 14:39:01