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

解決済みの質問

【SQL】登録されているかを比較したい

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でないのですべて登録できていないと判断する。

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

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

投稿日時 - 2011-11-04 11:21:47

QNo.7112503

困ってます

質問者が選んだベストアンサー

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));

でどうでしょうか。

投稿日時 - 2011-11-04 15:18:55

お礼

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

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

投稿日時 - 2011-11-05 19:01:19

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

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

回答(4)

ANo.4

(蛇足)

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 登録価格

投稿日時 - 2011-11-04 15:25:15

ANo.2

これでどうでしょう。
(オラクル環境がなく確認していません。)

----
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

投稿日時 - 2011-11-04 14:45:05

お礼

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

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

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

投稿日時 - 2011-11-05 18:55:49

ANo.1

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

---
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.商品コード

投稿日時 - 2011-11-04 11:51:48

補足

補足です
以下の部分を
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:34

お礼

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:18

あなたにオススメの質問