こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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'

投稿日時 - 2018-10-13 12:56:59

QNo.9547170

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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 売伝.売上伝票番号 = 売明.売上伝票番号

こんな感じ。

投稿日時 - 2018-10-13 23:17:37

あなたにオススメの質問