SQLでのデータチェック方法
- 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 商品マスタに存在しない このような感じで理由も追加することは可能でしょうか? わがままですみません。 よろしくお願いします。
- sakuraiy2
- お礼率50% (28/55)
- Oracle
- 回答数1
- ありがとう数2
- みんなの回答 (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(代理店.代理店,'代理店マスタ','')||'に存在しない とかメッセージ作っちゃうとか
関連するQ&A
- SQL LEFT JOIN
SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT * FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。
- ベストアンサー
- Oracle
- 集計の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文でできる方法があれば知りたいと思っています。 よろしくお願いします。
- ベストアンサー
- Oracle
- 最後のデータを含むレコード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
- 締切済み
- MySQL
- 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
- 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を作ればいいのでしょうか。
- ベストアンサー
- Oracle
- 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) 上記の記述で結合させても、うまくいきませんでした。 宜しくお願いします。
- ベストアンサー
- Microsoft ASP
- 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
- 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 どうしたらよいでしょうか? よろしくお願い致します。
- ベストアンサー
- Oracle
お礼
なるほど! チェック項目が増えそうなので、union案を採用させていただきました! 早々にご回答いただきましてありがとうございました。