0

さらに明確にするために、元の投稿を言い換えます。

現在、以下の表があります。

Product_Ref

  • 製品番号
  • 商品名

製品

  • 製品番号
  • so_date (日付)
  • 総売上高

カレンダー

  • dt (日付フィールド、各行は過去/次の 10 年間の 1 日を表します)

過去 6 か月間 (SYSDATE に基づく) に販売された製品の数を日単位で示すレポートを作成しようとしています。レポートは、可能なすべての product_id に対して、過去 6 か月間のすべての日の組み合わせである必要があります。形式:

商品ID | 日付 | 総売上高

製品テーブルに 0 エントリがあったと仮定した場合 (つまり、売上がなかった場合)、完全なレポート出力が期待されますが、代わりに 6 か月分のゼロ化されたデータが表示されます。

1 | 2012-01-01 | 0
2 | 2012-01-01 | 0
3 | 2012-01-01 | 0
1 | 2012-01-02 | 0
2 | 2012-01-02 | 0
3 | 2012-01-02 | 0
…

これは、product_reference テーブルに 3 つの製品があることを前提としています。元のクエリ (以下に記載) は 10 のスターターでしたが、ここからどこに行けばよいかわかりません。

SELECT products.product_id, calendar.dt, products.total_sales
FROM products RIGHT JOIN calendar ON (products.so_date = calendar.dt)
WHERE calendar.dt < SYSDATE AND calendar.dt >= ADD_MONTHS(SYSDATE, -7)+1
ORDER BY calendar.dt ASC, products.product_id DESC;
4

3 に答える 3

1

手がかりは質問にあります-CROSS JOINを探しています。

SELECT products.product_id, calendar.dt, products.total_sales
FROM Product_Ref
CROSS JOIN calendar 
LEFT JOIN products ON products.so_date = calendar.dt 
                    AND products.product_id = Product_Ref.product_id
WHERE calendar.dt < SYSDATE AND calendar.dt >= ADD_MONTHS(SYSDATE, -7)+1
ORDER BY calendar.dt ASC, products.product_id DESC;

「製品」が実際には「販売」を意味し、「Product_Ref」が製品であるテーブル名に最初は混乱しました!

これは、以前ここに投稿した CROSS JOIN の使用例と非常によく似ています。

于 2013-01-16T17:13:05.117 に答える
0

私が理解している限り、売り上げがなければ結果が出ないことを望んでいるのは何ですか?

したがって、 RIGHT JOININNER JOINに変更するだけでよいと思います。

右結合では、JOIN テーブルにレジスタがあり、FROM テーブルにない場合、JOIN テーブルからデータが返され、FROM テーブルを参照する列に NULL 値が含まれます。

INNER 結合により、両方のテーブルに一致するデータがあった場合にのみ結果が得られます。

私がよく理解し、それが役立つことを願っています。

于 2013-01-16T16:25:35.883 に答える
0

目的の出力が、製品の日付のみをカレンダー テーブルの日付と一致させることであると仮定すると、次を使用する必要がありますINNER JOIN

SELECT c.dt, p.product_id, p.total_sales
FROM calendar c
INNER JOIN products p on c.dt = p.so_date
WHERE c.dt < SYSDATE and c.dt >= ADD_MONTHS(SYSDATE,-7)+1
ORDER BY c.dt ASC, p.product_id DESC;

CROSS JOINは製品テーブルとカレンダー テーブルのすべての組み合わせで結果を生成するため、 を使用する必要はありませんON

- 編集

以下の編集を参照してください(未テスト):

SELECT PR.Product_ID, C.dt, P.TotalSales
FROM Calendar C 
   CROSS JOIN Product_Ref PR 
   LEFT JOIN Product P ON P.Product_Id = PR.Product_Id and p.so_date = c.dt
WHERE c.dt < SYSDATE and c.dt >= ADD_MONTHS(SYSDATE,-7)+1
ORDER BY c.dt ASC, p.product_id DESC;

幸運を。

于 2013-01-16T16:23:21.860 に答える