dポイントプレゼントキャンペーン実施中!

SQL初心者で仕事でSQL文を考えています。
どのようにすればいいのかよくわからないので教えてください。

現在、商品マスタと価格テーブルがあります。
(商品マスタ)
商品コード 商品名
 0001    商品A
 0002    商品B
 0003    商品C
 0004    商品D

(価格テーブル)
 商品コード 価格  登録日
  0001    100円  11/1
  0001    110円  11/2
0002 200円 11/1
0002 190円 11/2
0001 105円 11/3

それぞれの商品(商品コード)には毎日価格を登録するようになっています。
今日が11/3である場合、商品コード=0001、商品Aは登録がされていますが
その他の商品は登録されていない状況です。

碌このような状況で「今日の価格は全商品登録されているか」
ということをSQLでチェックすることはできるのでしょうか。
2回のSQLに分けて個数を比較するが普通ですか。

たとえば、
(1)select count from 商品マスタ
(2)select count from 価格 where sysdate = 登録日
(1)-(2)が0でないのですべて登録できていないと判断する。

複雑すぎてよくわかりません。

よろしくおねがいします。

A 回答 (4件)

select case when count(*) > 0 then '1つでも登録されていない' else 'すべて登録済み' end 登録状況


from (
select a.SHOHIN_CODE
from T_SHOHIN a
where not exists (
select *
from T_KAKAKU b
where a.SHOHIN_CODE = b.SHOHIN_CODE
and b.KIJUN_DATE = 20111104));

でどうでしょうか。
    • good
    • 0
この回答へのお礼

このようなやりかたがあるんですね

どうしてそう書くのかを調べました。
どこから評価されるのか疑問でした。
勉強になりました。
ありがとうございます。

お礼日時:2011/11/05 19:01

(蛇足)



CASE
WHEN TO_CHAR(B.KAKAKU) IS NOT NULL THEN '登録なし'
ELSE TO_CHAR(B.KAKAKU)
END as 登録価格

これは逆ですね。

CASE
WHEN B.KAKAKU IS NOT NULL THEN TO_CHAR(B.KAKAKU)
ELSE '登録なし'
END as 登録価格
    • good
    • 0

これでどうでしょう。


(オラクル環境がなく確認していません。)

----
SELECT
CASE WHEN COUNT(C.NG) > 0 THEN '未入力あり' ELSE '全登録' END as 登録状況
FROM
(SELECT
0 as NG
FROM 商品マスタ A
LEFT JOIN
(SELECT
商品コード
,価格
FROM 価格テーブル
WHERE 登録日 = '11/3'
) B
ON A.商品コード = B.商品コード
WHERE B.価格 IsNull ) C
GROUP BY C.NG
    • good
    • 0
この回答へのお礼

返信が遅れました。
申し訳ありません。

皆様のおかげで解決できました。
ありがとうございます。

まだまだ勉強不足です。
がんばります。

お礼日時:2011/11/05 18:55

商品マスタと価格テーブルの登録日抽出分を結合すればできます。



---
SELECT
A.商品コード
,A.商品名
,CASE WHEN B.価格 IsNull THEN '登録なし' ELSE B.価格 END as 登録価格
FROM 商品マスタ A
LEFT JOIN
(SELECT
商品コード
,価格
FROM 価格テーブル
WHERE 登録日 = '11/3'
) B
ON A.商品コード = B.商品コード

この回答への補足

補足です
以下の部分を
CASE WHEN B.KAKAKU IS NOT NULL THEN '登録なし' ELSE B.KAKAKU END as 登録価格

CASE
WHEN TO_CHAR(B.KAKAKU) IS NOT NULL THEN '登録なし'
ELSE TO_CHAR(B.KAKAKU)
END as 登録価格
としたらできました。

結果マスタレコード分抽出されました。
実際には、個別の結果ではなく全体として
「すべて登録済みか、1つでも登録されていないか」
ということを知りたいのです。
質問内容が良くなかったです。
すみません。

補足日時:2011/11/04 13:52
    • good
    • 0
この回答へのお礼

o_chi_chiさん

早速の回答ありがとうございます。
こういう方法があるのですね。

もう1つ質問させてください。
教えてもらったSQL文を実行してみたところ
「ORA-00932: データ型が一致しません: CHARが予想されましたがNUMBERです。」
となってしまいました。
型は合っていると思うのですが誤りがありますか。
何度も質問してすみません。

(実行したSQL)
SELECT
A.SHOHIN_CODE
,A.SHOHIN_NAME
,CASE WHEN B.KAKAKU IS NOT NULL THEN '登録なし' ELSE B.KAKAKU END as 登録価格

FROM T_SHOHIN A

LEFT JOIN
(SELECT
SHOHIN_CODE
,KAKAKU
FROM T_KAKAKU
WHERE KIJUN_DATE = 20111104
) B
ON A.SHOHIN_CODE = B.SHOHIN_CODE

KAKAKU:NUMBER型
KIJUN_DATE:NUMBER型
SHOHIN_CODE:VARCHAR2型
SHOHIN_NAME:VARCHAR2型

お礼日時:2011/11/04 13:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す