SQLでのデータチェック方法

このQ&Aのポイント
  • SQLでのデータチェック方法について教えてください。
  • 各種マスタに存在しないデータを抽出する方法を知りたいです。
  • 抽出結果にレコードが抽出された理由も表示させることは可能でしょうか?
回答を見る
  • ベストアンサー

SQLでのデータチェック方法

いつもお世話になっております。 SQLでのデータチェック方法について教えてください。 【売上テーブル】 日付、商品、代理店、金額 ---------------------- 5/1 消しゴム AA商店 100 5/1 鉛筆    BB商店 200 5/2 鉛筆    ZZ商店 200 5/2 万年筆  CC商店 150 【商品マスタテーブル】 品名 ----------- 消しゴム 鉛筆 【代理店マスタテーブル】 代理店 ----------- AA商店 BB商店 CC商店 この中で各種マスタに存在しないデータを抽出したいです。 select * from 売上テーブル where 商品 not in (select 品名 from 商品マスタ) or 代理店 not in (select 代理店 from 代理店マスタ) で抽出できるのはわかるのですが、 抽出結果に何故そのレコードが抽出されたのかをわかるようにしたいです。 日付、商品、代理店、金額  理由 ------------------------------- 5/2 鉛筆    ZZ商店 200 代理店マスタに存在しない 5/2 万年筆  CC商店 150 商品マスタに存在しない このような感じで理由も追加することは可能でしょうか? わがままですみません。 よろしくお願いします。

  • Oracle
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • jhayashi
  • ベストアンサー率29% (535/1843)
回答No.1

たとえば or使わないで UNION 使って selct 日付,商品,代理店,金額,'代理店マスタに存在しない' from 売上テーブル where 代理店 not in (select 代理店 from 代理店マスタ) union selct 日付,商品,代理店,金額,'商品マスタに存在しない' from 売上テーブル where 商品 not in (select 品名 from 商品マスタ) といったように別々の条件でselectしてしまう(代理店になく商品にも無いのは2行出てくる) 外部結合使って 外部結合先がNULLかどうかで判断してしまう select 日付,商品,代理店,金額,nvl2(商品マスタ.品名,'商品マスタに存在しない',null),nvl2(代理店.代理店,'代理店マスタに存在しない',null) from 売上テーブル,商品マスタ,代理店 where 売上テーブル.商品 = 商品マスタ.品名(+) and 売上テーブル.代理店 = 代理店.代理店(+) and (商品マスタ.品名 is null or 代理店.代理店 is null) (+)つかわないでOUTER JOIN句つかって書いてもいいし とりあえず nvl2で表記してみましたが CASE WHENなどつかって1カラムで '商品マスタと代理店マスタに存在しない'を加えて3通りの表示してあげるとか nvl2(商品マスタ.品名,'商品マスタ','')||nvl2(代理店.代理店,'代理店マスタ','')||'に存在しない とかメッセージ作っちゃうとか

sakuraiy2
質問者

お礼

なるほど! チェック項目が増えそうなので、union案を採用させていただきました! 早々にご回答いただきましてありがとうございました。

関連するQ&A

  • SQL LEFT JOIN

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

  • 集計のSQLについて

    皆さんの知恵をお借りしたいと思っています。 どなたか、良い案がある方お願いいたします。 以下のテーブルがあります。 (売上テーブル) 品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   40    Bさん 鉛筆   30    Bさん 鉛筆   30        鉛筆   10        上のテーブルで、品名・購入者を集計キーとして、 金額を集計したい場合、 SELECT 品名,購入者,SUM(金額) FROM 売上テーブル GROUP BY 品名,購入者  というSQL文で,   品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   70    Bさん 鉛筆   40        という結果が得られると思いますが・・・、 これを、 品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   70    Bさん 鉛筆   30        鉛筆   10        という結果になるようなSQL文を作りたいのです。 購入者が入っているものについては、品名・購入者で集計して、 購入者が空欄のものは集計しないようにしたいと思っています。 UNIONを使えばできるとは思うのですが、 それ以外の方法で、1回のSQL文でできる方法があれば知りたいと思っています。 よろしくお願いします。

  • 最後のデータを含むレコード1行 MYSQL

    お世話になります。 最後の日にちを含むレコード全ての抽出方法がどうしてもわかりません。 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 4 AA 3/2 7 5 BB 3/2 4 6 AA 3/3 1 これを、select * from テーブル group by name とすると、 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 select id, name, max(date),amount from テーブル group by name とすると、 id name date amount 1 AA 3/3 5 2 BB 3/2 5 3 CC 3/1 5 望んでいる結果はこうです。最後のdateを含むレコード全てです。 id name date amount 3 CC 3/1 5 5 BB 3/2 4 6 AA 3/3 1 select * from テーブル as a where a.date=(select max(b.date) From テーブル as b where a.id=b.id); このようにしましたが、データの数が膨大なのですごく時間がかかってしまいます。 他、シンプルな方法はないでしょうか。 よろしくお願いします。 MYSQL バージョン5.0.45

  • SQL文で作ったデータを使ったUPDATE

    環境はMySQL5.6です。 下記のテーブルccがあります。 【cc】 shisan  user 500  tanaka 1000  mikami 400   tanaka 1300  mikami SELECT Total, user FROM (SELECT SUM( cc.shisan ) AS Total, user FROM cc GROUP BY user) AS t1 とすることによりSQL上にt1テーブルを作ることが出来ます。 【t1】 Total  user 900  tanaka 2300  mikami 次に、このt1テーブルのTotalの数値を下記のmoney_tableにあるcash欄に挿入(UPDATE)したいと考えています。 【money_table】 cash  user 0   tanaka 0   mikami そこで下記のSQL文を作ったのですがエラーになります。 UPDATE money_table,cc SET money_table.cash=t1.Total FROM (SELECT Total, user FROM (SELECT SUM( cc.shisan ) AS Total, user FROM cc GROUP BY user) AS t1) WHERE money_table.user=t1.user どこがいけないのかご指導いただけませんでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • SQL ?で終わる

    アクセスのSQL文で、テーブルのフィールドの値が、最後が?で終わるものを抽出したいのですが SELECT テーブル.フィールド FROM テーブル WHERE (((テーブル.フィールド) Like "[*?]")); これだと1件も抽出されません。 Like "[*?]"が間違ってると思うのですが、どうすればいいでしょうか?

  • Access2003で抽出したクエリのデータについて

    Access2003を使用しています。 月次データのテーブルが以下のようにあります。 得意先  品名    本数 A商店  鉛筆-赤   5本 A商店  鉛筆-赤  △5本 A商店  鉛筆-赤   2本 A商店  鉛筆-黒   2本 クエリを使用して、同じ得意先・品名なら、以下のように数量を集計しています。 A商店  鉛筆-赤   2本 A商店  鉛筆-黒   2本 元データが増えてしまい、集計したクエリに該当するデータだけ、 元のテーブルに欲しいのですが、可能でしょうか? (赤伝を起こしたら、元の黒伝と共に、不要データなのです) 分かりづらくてすみませんが、アドバイスを頂けたら助かります。 宜しくお願い致します。

  • データの無いテーブルと結合してデータ抽出

    以下のテーブルを使用してデータを抽出したいのですが、データが抽出できません。 名称テーブル -------------------- ID | NAME | -------------------- 0   AA 1   BB 2   EE 3   FF 履歴テーブル -------------------- ID | DAY | OLDNAME -------------------- 2   2004   CC 3   2004   DD 結果取得したいデータ -------------------- ID | NAME | OLDNAME -------------------- 0   AA =現在のSQL= SELECT A.ID, A.NAME, B.OLDNAME FROM 名称 A , 履歴 B WHERE A.ID = B.ID(+) AND A.ID=0 AND B.DAY =  (SELECT MAX(C.DAY)  FROM 履歴 C  WHERE  A.ID = C.ID(+)) 履歴テーブルには名称テーブルの履歴があります。 履歴にデータが無くても名称データを取得したいのですが、こういった場合はどのようなSQLを作ればいいのでしょうか。

  • ASPによるSQL構文で2つのデータベースを連結

    下記のように2つのデータベースを連結させたいのですが うまくいきません。 仕事で緊急なのでわかる方教えてください。 データベースはACCESSです。 テーブル1 A | B(日付) ---|---------- aa |2004/01/01 bb |2004/02/02 テーブル2 C | D(日付) ---|---------- cc |2004/03/03 dd |2004/04/04 ee |2004/05/05 結果 A | BD(日付) | C ---|----------|---- aa |2004/01/01| bb |2004/02/02|   |2004/03/03| cc   |2004/04/04| dd   |2004/05/05| ee strSQL="SELECT A,B,null FROM テーブル1 union all SELECT null,D,C FROM テーブル2" Set RgRs = cnn.Execute(strSQL) 上記の記述で結合させても、うまくいきませんでした。 宜しくお願いします。

  • SQL構文を手助けしてください

    (1)のようなテーブルデータを(2)のように表示したいと思います。 AA,BB,CC,DD,EEは列名としてください。 (1) AA BB CC DD EE __________________________ 00 01 2004/01/01 XX YY 01 00 2004/01/01 XE YD 01 00 2004/01/05 XZ YZ 02 01 2004/01/10 X2 YE 02 02 2004/01/05 XW YI 02 02 2004/01/06 XF YL (2) AA BB CC DD EE __________________________ 00 01 2004/01/01 XX YY 01 00 2004/01/05 XZ YZ 02 01 2004/01/10 X2 YE 02 02 2004/01/06 XF YL <条件> AAとBBでキーを作り、CCのMAXの該当レコードを表示したい。 SELECT AA,BB,MAX(CC),DD,EE FROM TEST_TABLE GROUP BY AA,BB というような感じかなと思ったのですが、「GROUP BY の式ではありません」と怒られてしまいます。 どなたか簡単なやり方をご存知で無いでしょうか?

  • Oracle SQLでのデータ抽出

    Oracle、SQLともに初心者のため困っています。 どなたか教えてください。 フィールド1、2で重複(2件以上存在)するレコードに対して、そのテーブルの全項目を取得したいのです。 例: 処理前 フィールド1,フィールド2 ,フィールド3 1 , AA, 1 1 , AA, 2 1 , BB, 3 1 , BB, 4 2 , CC, 5 2 , CC, 6 3 , DD, 7 4 , EE, 8 5 , FF, 9 処理後 フィールド1, フィールド2,フィールド3 1 , AA, 1 1 , AA, 2 1 , BB, 3 1 , BB, 4 2 , CC, 5 2 , CC, 6 どうしたらよいでしょうか? よろしくお願い致します。