選択した日付範囲 (1 週間から 12 週間まで) で日ごとにグループ化された特定のカテゴリ項目の売上の合計を収集し、トランザクションが発生していない日には NULL ではなく 0 を返す必要があります。
私の最初のアイデアは、約 10 年の日付を持つ「カレンダー」(以下に示す) と呼ばれる事前入力されたテーブルを使用することでした。
結果が大きすぎて処理できないため、最初に選択した日付範囲を「カレンダー」と同じ列名を共有する「datetable」という空のテーブルにコピーしようとしています。だから私は3つのテーブルを持っています:
「カレンダー」テーブル。次の列名を持つ 10 年分の日付があります。
IsoDate DayNameOfWeek
2012-01-01 Sun
2012-01-02 Mon
2012-01-03 Tue
2012-01-04 Wed
2012-01-05 Thu
2012-01-06 Fri
2012-01-07 Sat
2012-01-08 Sun
2012-01-09 Mon
2012-01-10 Tue
etc for 10yrs
" datetable " テーブル (これは "calendar" テーブルから事前入力する 2 つの列で空に作成されるため、LEFT JOIN の日付範囲データはよりコンパクトになります):
IsoDate DayNameOfWeek
「製品」テーブル。各 ProductCat の売上を保存している場所です。
ExpDate ProductCat Amount
2012-01-03 28 232
2012-01-04 29 100
2012-01-04 29 1002
2012-01-06 12 12
2012-01-06 29 9
2012-01-07 10 100
2012-01-07 29 122
2012-01-07 29 17
私が探している出力は、単一の「ProductCat」番号 (この場合は 29) に基づいています。
IsoDate DayNameOfWeek AmountSummed
2012-01-01 Sun 0
2012-01-02 Mon 0
2012-01-03 Tue 0
2012-01-04 Wed 1102
2012-01-05 Thu 0
2012-01-06 Fri 9
2012-01-07 Sat 139
2012-01-08 Sun 0
2012-01-09 Mon 0
2012-01-10 Tue 0
私のコードは以下です。最初の挿入は正常に機能しますが、JOIN と SUM を使用した 2 番目の部分を機能させる構文がわかりません。
INSERT INTO datetable (IsoDate, DayNameOfWeek)
SELECT IsoDate, DayNameOfWeek
FROM calendar
WHERE IsoDate
BETWEEN '2012-07-01' AND '2012-07-10'
SELECT ExpDate, SUM(IFNULL(Amount, 0))
AS AmountSummed
FROM products
WHERE ProductCat = 29
AND ExpDate BETWEEN '2012-07-01' AND '2012-07-10'
LEFT JOIN products
ON datetable.IsoDate=products.ExpDate
GROUP BY datetable.IsoDate
編集
これは現在動作するコードです:
SELECT C.IsoDate,IFNULL(SUM(P.Amount),0) AS AmountSummed
FROM calendar C LEFT OUTER JOIN products P ON C.IsoDate=P.ExpDate
AND P.ProductCat = 29
WHERE C.IsoDate BETWEEN '2012-07-01' AND '2012-07-10'
GROUP BY C.IsoDate, C.DayNameOfWeek
ORDER BY C.IsoDate