SQLは日付でグループ化されますが、レコードなしの日付も取得します
質問
期間にすべての日を含む GROUP BY DATE(timestamp)
を実行する簡単な方法はありますか?
基本的に、次のようなレポートを生成する必要があります:
24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders
解決
GROUP BYを使用する代わりに、たとえば次のような特定の日付を含むテーブル(おそらく一時テーブル)を作成します。
24 Dec
23 Dec
22 Dec
21 Dec
20 Dec
次に、そのテーブルをOrdersテーブルに結合します。
他のヒント
日付よりも注文が多いと仮定すると、次のようになります:
select date, count(id) as orders
from
(
SELECT DATE_ADD('2008-01-01', INTERVAL @rn:=@rn+1 DAY) as date from (select @rn:=-1)t, `order` limit 365
) d left outer join `order` using (date)
group by date
1つの方法は、カレンダーテーブルを作成し、それに対して結合することです。
永久に作成し、新しい日付を挿入するタスクを作成します。毎週、毎日、毎月などを実行できます。
タイムスタンプを日付に変換することを想定していることに注意してください。
出力に含めるすべての日付を含む中間結果セットを生成する必要があります...
ストアドプロシージャでこれを行う場合、一時テーブルまたはテーブル変数を作成できます(MySQLの機能は知りません)が、テーブルまたは何らかの結果セットにすべての日付があると
外部結合を使用して、一時テーブルから実際のデータに結合するだけ
SQL Serverでは次のようになります
Declare @Dates Table (aDate DateTime Not Null)
Declare @StartDt DateTime Set @StartDt = 'Dec 1 2008'
Declare @EndDt DateTime Set @EndDt = 'Dec 31 2008'
While @StartDt < @EndDt Begin
Insert @Dates(aDate) Values(@StartDt)
Set @StartDt = DateAdd(Day, 1, @StartDt)
End
Select D.aDate, Count(O.*) Orders
From @Dates D Left Join
OrderTable O On O.OrderDate = D.aDate
Group By D.aDate
データウェアハウスでは、すべての日付を含むテーブルを作成し、データと日付テーブルの間に外部キーを作成します。これがあなたの場合の最善の方法であると言っているのではなく、レポート目的で大量のデータをさまざまな方法でロールアップする必要がある場合のベストプラクティスであるというだけです。
SQL Serverでレポートレイヤーを使用している場合は、データが返された後、レポートを表示する前に、対象の範囲内に欠落している日付を挿入するロジックを記述することができます。
SQL Serverから直接レポートを作成していて、まだデータウェアハウスがなく、すぐにデータウェアハウスを作成する必要がない場合は、日付テーブルを作成して結合します。結合を実行して必要な出力を取得するために必要なフォーマット設定は少し不安定かもしれませんが、仕事は完了します。
これを行うには非常に簡単な方法があります&#8230;覚えていないことを除いて。しかし、このスレッド:
SELECT
DISTINCT(LEFT(date_field,11)) AS `Date`,
COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`
MySQLでも動作します