2

GROUP BY DATE(timestamp)その日付に関連付けられているレコードがあるかどうかに関係なく、期間内のすべての日を含める簡単な方法はありますか?

基本的に、次のようなレポートを生成する必要があります。

24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders
4

6 に答える 6

5

日付よりも多くの注文があると仮定すると、次のようなものが機能します。

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
于 2008-12-30T17:50:26.580 に答える
3

1 つの方法は、カレンダー テーブルを作成し、それに対して結合することです。

永続的に作成してから、新しい日付を挿入するタスクを作成します。これは、毎週、毎日、毎月などで実行できます。

タイムスタンプを日付に変換していると仮定していることに注意してください。

于 2008-12-30T16:36:00.053 に答える
2

GROUP BY を使用する代わりに、必要な特定の日付を含むテーブル (おそらく一時テーブル) を作成します。次に例を示します。

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

次に、そのテーブルを Orders テーブルに結合します。

于 2008-12-30T16:39:14.853 に答える
0

出力に含めたいすべての日付を含む中間結果セットを生成する必要があります...

ストアド プロシージャでこれを行っている場合は、一時テーブルまたはテーブル変数を作成できます (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
于 2008-12-30T16:42:14.177 に答える
0

データ ウェアハウスでは、すべての日付を含むテーブルを作成し、データと日付テーブルの間に外部キーを作成する方法が採用されています。これがあなたの場合に最適な方法であると言っているのではなく、レポート目的で大量のデータをさまざまな方法でロールアップする必要がある場合のベスト プラクティスです。

SQL Server でレポート レイヤーを使用している場合は、データが返された後、レポートをレンダリングする前に、対象の範囲内に不足している日付を挿入するロジックを記述できます。

SQL Server から直接レポートを作成していて、データ ウェアハウスがまだなく、作成する時間も必要もない場合は、日付テーブルを作成して結合します。結合を行って必要な出力を得るために必要なフォーマットは、少し不安定かもしれませんが、仕事は完了します。

于 2008-12-30T16:49:41.587 に答える