0

私は2つの列があるテーブルを持っています:

マーク

CREAT_TS

2 つの日付範囲 (例: startDate と endDate) の間の毎日の平均点を取得したい

次のクエリを作成しました。

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

date(CREAT_TS) AS DATE 

from TABLENAME

group by date(CREAT_TS)

このクエリでは、データベースに日付の行がある場合にのみ、1 日の平均を取得できます。しかし、私の要件は、行がなくても、その日付に 0 を表示したいということです。(startDate, endDate) の間に X 日ある場合、クエリが X 行を返すようにしたいということです。

誰でも私を助けることができますか?:(

4

1 に答える 1

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 ははるかに単純に見えます。

これはどのように作動しますか?最初の大きなサブクエリには 2 つの部分があります。1 つ目は、0 ~ 9 の数字をクロス結合して算術演算を行うことにより、0 ~ 999 の数字を生成するだけです。2 つ目は、これを 2 つの日付に結合し、startdate-- enddateXXX と YYY に正しい値を入力する必要があります。このテーブルでは、2 つの値の間にすべての日付があります。999 日以上必要な場合は、クロス結合をもう 1 つ追加してください。

これは、データ テーブルに結合された左です。その結果、group by のすべての日付が表示されます。

レポートに関しては、プレゼンテーション層でこれを行うことには長所と短所があります。基本的に、SQL で実行する利点は、レポート レイヤーが単純になることです。レポート層でこれを行う利点は、SQL がより単純になることです。部外者がその判断を下すのは難しい。

私の提案は、このようなレポートで使用できる数値表を作成することです. そうすれば、クエリがより単純に見え、レポート レイヤーを変更する必要がなくなります。

于 2013-03-04T14:49:58.780 に答える