0

選択した日付範囲 (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
4

1 に答える 1

0

必要なものはほとんど揃っています。ただし、 datetableは必要ありません。

クエリは次のようになります。

SELECT C.IsoDate, C.DayNameOfWeek, IFNULL(SUM(P.Amount),0) AS AmountSummed
FROM calendar C LEFT JOIN products P ON C.IsoDate=P.ExpDate
WHERE C.IsoDate BETWEEN '2012-07-01' AND '2012-07-10'
  AND P.ProductCat = 29
GROUP BY C.IsoDate, C.DayNameOfWeek
ORDER BY C.IsoDate

本当に を使用したい場合は、探しているすべての日付が既に含まれているためdatetable、 を に置き換えてcalendar削除します (開始前に が空であっC.IsoDate BETWEEN '2012-07-01' AND '2012-07-10'たと仮定します)。datetabledatetime

于 2012-07-10T00:58:50.047 に答える