SQLで商品の登録状況をチェックする方法

このQ&Aのポイント
  • SQL初心者の方が商品の登録状況をチェックする方法について教えてください。
  • 商品マスタと価格テーブルを比較して、登録されていない商品を見つける方法を教えてください。
  • 商品の登録状況をSQLを使用して確認する方法について教えてください。
回答を見る
  • ベストアンサー

【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でないのですべて登録できていないと判断する。 複雑すぎてよくわかりません。 よろしくおねがいします。

  • Oracle
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

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)); でどうでしょうか。

ikebukuro2011
質問者

お礼

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

その他の回答 (3)

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.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 登録価格

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.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

ikebukuro2011
質問者

お礼

返信が遅れました。 申し訳ありません。 皆様のおかげで解決できました。 ありがとうございます。 まだまだ勉強不足です。 がんばります。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.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.商品コード

ikebukuro2011
質問者

お礼

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型

ikebukuro2011
質問者

補足

補足です 以下の部分を 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つでも登録されていないか」 ということを知りたいのです。 質問内容が良くなかったです。 すみません。

関連するQ&A

  • 重複するレコードを調べるSQL

    重複するレコードを調べるSQL 初歩的な質問ですみません! 重複するレコードを調べるために以下のようなSQLを作ったのですが、 遅くて困っています。 もっと速くする方法があれば教えてください! 異なるカテゴリーでも商品コードが重複しているものがないかを探すSQLです。 SELECT A.商品コード, A.X, B.カテゴリー FROM (SELECT COUNT(商品コード) X, 商品コード FROM テーブルA WHERE 追加年月 = 201008 GROUP BY 商品コード) A, (SELECT 商品コード, カテゴリー FROM テーブルA WHERE 追加年月 = 201008 ) B " WHERE A.X >= 2 AND B.商品コード = A.商品コード

  • SQL文で質問

    SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。

  • SQLについて

    SELECT COUNT( * ) FROM テーブル1で出たデータを別テーブルの数量に書き込みたいのですがどういう風にSQLを書けばいいですか??

  • sql server whereについて

    sql server express2012 のselect文で select * from 商品マスタ where 商品コード in (1,2,3,1)とした場合、商品マスタには商品コード=1のデータは1件しかないけど、商品コード=1のデータ(同一データ)を2行表示する方法はありませんか? 宜しくお願いします

  • SQL LEFT JOIN

    SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。

  • 集計のSQLをお教え下さい

    初心者ですよろしくお願いします。 以下の様なテーブルがあり、年月と場所コードで 件数を出したいと考えております。 申し訳ありませんが、SQLの記述をお教え下さい。 年月日 | 場所コード |  20060510   1000 20060511   1000 20060511   2000 20060512   2000 20060601   1000 20060601   2000   ・    ・    ↓ 年月日 | 場所コード | count 200605   1000      2 200605   2000      2 200606   1000      1 200606   2000      1 年月日を年月にして集計したいと考えています。 select 年月日,場所コード,count(*) from table group by substring(年月日 from 1 for 6) ではうまくいきませんでした・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL WHERE文のノットイコールについて

    初歩的な質問ですみません。 Oracle9iでsqlplusで接続しています。 「member_accountテーブルのdelete_flag(VARCHAR2)カラムの値が'1'ではない」ものを抽出したいと考えてます。 ただ、正しい結果が返ってきません。 何が問題でしょうか?よろしくお願いいたします。 ============================================================ SQL> select count(ID) from member_account; COUNT(ID) ---------- 16450 SQL> SQL> select count(ID) from member_account where delete_flag='1'; COUNT(ID) ---------- 107 SQL> SQL> select count(ID) from member_account where delete_flag<>'1'; COUNT(ID) ---------- 0 SQL> SQL> select count(ID) from member_account where delete_flag!='1'; COUNT(ID) ---------- 0 ============================================================ よろしくお願いいたします。

  • SQL(Where句)

    商品を登録するテーブル(商品テーブル)があって 構造が 商品主コード varchar(5) 商品補助コード varchar(2) 商品名 varchar(10) です。 商品主コードと商品補助コードを一つにして「商品コード」として使用しています。(ex:12345-00) 検索の際、商品コードをインプットボックスに「12345-00」と入力してその商品名を取得したいのですが、上手くいきません。 どなたかお願いします! 現在のSQLは Select 商品名 From 商品テーブル Where 商品主コード || '-' || 商品補助コード Like '%入力された商品コード%' です。

  • SQL 副問い合わせ

    以下のaテーブルのcardidと、bテーブルのnoが同じで、 かつ、bテーブルのryodtmが前月のデータを抽出する以下のsqlを、 aテーブルのcardidが、bテーブルのnoと同じで、かつ、ryodtmが前月分、 または、cテーブルのchangcardと同じで、かつ、ryodtmが前月分のを抽出する場合、 どうすればいいでしょうか? select * from a where cardid in ( select distinct(no) from b where kdncresbt ='1' and ryodtm >= TO_CHAR(ADD_MONTHS(TRNC(SYSDATE,'MONTH'), -1),'YYYYMM' ) || '01' and ryodtm < TO_CHAR(SYSDATE,'YYYYMM') || '01' )

  • SQLについて何ですが

    一つのSQLで下記の様な検索が出来ないかと考えています、 大分類に分けて大分類の中で売れている商品のTOP10を表示し、 現在表示されている商品を抜いた売れている商品TOP100もに表示できるようとしています、 分類のテーブル・商品がどの分類に当てはまるのか関連づけし注文数も保持しているテーブル・商品の売れ行きを保持しているテーブルがあり 分類テーブルには15個(将来的に増える可能性ある)の分類ワードが入っていて、分類別に売れているTOP10を表示し重複部分もあるので最大150個の商品が表示されるようになっています、 全商品の売れ行きTop「表示されている商品プラス100件」を割り出しその中から表示商品はずしてみようと思いこの様なSQL文と作ったのですが今一うまくいっていないような気がします、 「select 商品名 注文数 from 商品テーブル    where 商品名 not in( select 商品名 from 分類商品テーブル where 分類 in ( select 分類 from 分類テーブル )    order by 注文数 desc limit 10) order by 注文数 desc limit 表示商品数+100」 どうもうまく表示できていない様な気がしているのですが、 このSQLどうなのでしょうか? ほかにもっといいSQL文があれば教えてください。 」