• 締切済み

oracle SQL

売上情報を日別に集計して抽出しようと考えております。 その際に売上が存在しない日のレコードも纏めて抽出したいと考えております。 以下のように日付一覧を副問合せで生成し、left joinすれば良いかと 考えたのですが、結果は売上が存在するレコードしか抽出されません。 下記のSQLでは何が原因で全日付が抽出されないのか分る方がいらっしゃいましたらご教授頂けますと幸いです。 select 売明.商品コード, 売伝.納品日, 月日.全日, -- TO_CHAR(売伝.納品日,'DY') AS 曜日, TO_CHAR(月日.全日,'DD') AS 日, TO_CHAR(月日.全日,'DY') AS 曜日 -- count(売明.商品コード) AS 売上回数 from 売上伝票データ 売伝, 売上明細データ 売明, ( SELECT TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 AS 全日 FROM ALL_CATALOG WHERE TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 <= TO_DATE('20180430', 'YYYYMMDD') ORDER BY 1 ) 月日 where 売伝.納品日 BETWEEN TO_DATE('20180401','YYYY/MM/DD') AND TO_DATE('20180430','YYYY/MM/DD') AND 月日.全日 = 売伝.納品日(+) AND 売伝.売上伝票番号 = 売明.売上伝票番号 AND 売明.商品コード = '009405'

みんなの回答

  • iruyasu
  • ベストアンサー率37% (3/8)
回答No.1

(+) を使った書き方だと、結合条件と抽出条件の区別が曖昧になります。 >売伝.納品日 BETWEEN TO_DATE('20180401','YYYY/MM/DD') AND TO_DATE('20180430','YYYY/MM/DD') これだと、売伝.納品日が null になるデータは抽出されません。 標準SQL の書き方だと、はっきりと区別できます。 select 売明.商品コード, 売伝.納品日, 月日.全日, -- TO_CHAR(売伝.納品日,'DY') AS 曜日, TO_CHAR(月日.全日,'DD') AS 日, TO_CHAR(月日.全日,'DY') AS 曜日 -- count(売明.商品コード) AS 売上回数 from ( SELECT TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 AS 全日 FROM ALL_CATALOG WHERE TO_DATE('20180401', 'YYYYMMDD') + ROWNUM - 1 <= TO_DATE('20180430', 'YYYYMMDD') ORDER BY 1 ) 月日 left join 売上伝票データ 売伝 on 月日.全日 = 売伝.納品日 left join (select * from 売上明細データ where 商品コード = '009405' ) 売明 on 売伝.売上伝票番号 = 売明.売上伝票番号 こんな感じ。

関連するQ&A