日付に追加できる一連の整数を作成する必要があります。以下はあなたにアイデアを与えるでしょう:
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 ははるかに単純に見えます。
これはどのように作動しますか?最初の大きなサブクエリには 2 つの部分があります。1 つ目は、0 ~ 9 の数字をクロス結合して算術演算を行うことにより、0 ~ 999 の数字を生成するだけです。2 つ目は、これを 2 つの日付に結合し、startdate
-- enddate
XXX と YYY に正しい値を入力する必要があります。このテーブルでは、2 つの値の間にすべての日付があります。999 日以上必要な場合は、クロス結合をもう 1 つ追加してください。
これは、データ テーブルに結合された左です。その結果、group by のすべての日付が表示されます。
レポートに関しては、プレゼンテーション層でこれを行うことには長所と短所があります。基本的に、SQL で実行する利点は、レポート レイヤーが単純になることです。レポート層でこれを行う利点は、SQL がより単純になることです。部外者がその判断を下すのは難しい。
私の提案は、このようなレポートで使用できる数値表を作成することです. そうすれば、クエリがより単純に見え、レポート レイヤーを変更する必要がなくなります。