みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

Access 抽出漏れ行をみつけるクエリ

図のようなテーブル「TBL_A」がCSVファイルの形で提供されます。この「TBL_A」は全レコードのテーブルあり「正」データばかりのマスターと考えてください。

このCSVデータをACCESSによみこみテーブル「TBL_A」としてあります。

「TBL_A」をいろいろな人が加工したり、抽出作業をしているのですが、「TBL_B」のような抽出をかけて渡してきた人がいたので、「データ(レコード)が足りないので、不一致クエリで足りないのを見つけておいてください」と頼んだところ、何度やってもみつけられないというので、自分でも試してみました。

図でいえば、ピンク色のレコード(行)をみつければいいのですが、Accessで不一致クエリをかけてみたところ、図の下部のようなデータしか抽出できませんでした。

やったことは2つ
1)
TBL_Aを左にし、右にTBL_Bを右に配置し、不一致クエリウィザードでの矢印(→)で商品コードを紐付けた
2)
最初にTBL_AとTBL\Bをクエリで「商品コード」「価格」ぞれぞれ結びつけ(つまり2つの線)、「商品コード」「価格」を「クエリ1」として抽出。その「クエリ1」を上のTBL_Bの位置にもってきて、不一致クエリ。

どちらとも、結果は図の下のようになってしまいます。

図の上部のピンクの部分を確実に抜き出すには、どのようなクエリ(またはSELECT文)が必要でしょうか。

メモ:
・商品コードは「テキスト型」です。
・商品コードが同じでも販売場所やいろいろな経緯で価格が違っていたり、返品の場合は返金するためマイナス金額がつくことがあり、商品コードと価格はかならずしも合致しません。
・Accessは2010か2013を使っています。

※今回はVBAの質問ではありません。

投稿日時 - 2016-10-19 23:43:21

QNo.9245057

暇なときに回答ください

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

それは原理的にできないですよ。
例えば、001A/2000というレコードがTBL_Aに二つあって、TBL_Bに一つしかなかったら、TBL_Aに二つある001A/2000のどっちを削除したのか、人間が考えてもわからないです。
主キーがなきゃ駄目です。

TBL_Aに絶対に同じ商品コードで同じ価格のレコードがない、と分かっているのでしたら以下のSQLでピンクのレコードが抽出できます。

SELECT TBL_A.商品コード, TBL_A.価格, TBL_B.商品コード
FROM TBL_A LEFT JOIN TBL_B ON (TBL_A.価格 = TBL_B.価格) AND (TBL_A.商品コード = TBL_B.商品コード)
GROUP BY TBL_A.商品コード, TBL_A.価格, TBL_B.商品コード
HAVING (((TBL_B.商品コード) Is Null));

不一致クエリウィザードって使ったことないから、どんな風に操作すればこういうクエリ(SQL)を吐き出すのかは知りません。昔々やってみたことはありますが、日本語の意味が不明で、読むの面倒だから使うのやめました。
でも、LEFT JOIN して、相手がない((TBL_B.商品コード) Is Null)のレコードを拾ってくるだけです。

投稿日時 - 2016-10-20 01:29:53

お礼

ありがとうございます。
一応説明上わかりやすく「商品コード」と書きました、Web上でのクリック(してサービスを売る)に対して付与される「商品クリック番号」のようなものです。クリックごとユニークな番号が振られるのですが、そのサービスプランを同じユーザが繰り返し取り消しや内容変更を行うことがあるので、そのユーザと商品(プラン)はひもづいてしまっています。ゲスト注文(登録者でない人も使える)ができるので、ユーザIDはここの処理では使っていないの、ユーザがそのサービス商品を選んだとき、注文IDとして商品コード(プラン)と注文者氏名が紐付いて確定してしまいます。

同じコードがほかの方に付与されることはないので「ユニーク」ですが、同じ方が同じサービス商品に対して、オプションをつけたり、消したり、またつけたり(AMAZONの同じ商品2000円を注文して取り消して-2000円また再購入2000円するような)すると、コードに同じ価格が存在するようです。

本番の(実際に使っている)テーブルでやってみましたが、SELECT文を直書きしてやってみましたが、やはり抽出もれが起こりました。

主キーを与えたいのですが、そこはわたしは権限がないため、改造できないので困っています。

いずれにせよヒントをありがとうございました。

投稿日時 - 2016-10-20 22:26:56

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

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

回答(3)

ANo.3

> コードと金額に同じものがあるようです。

下記のSQLでどうでしょう。

SELECT
A.商品コード, A.価格
FROM
(
SELECT 商品コード, 価格, Count(*) AS カウント
FROM TBL_A
GROUP BY 商品コード, 価格
) AS A
LEFT JOIN
(
SELECT 商品コード, 価格, Count(*) AS カウント
FROM TBL_B
GROUP BY 商品コード, 価格
) AS B
ON A.カウント = B.カウント AND A.価格 = B.価格 AND A.商品コード = B.商品コード
WHERE
B.商品コード Is Null;

商品コード、価格 で重複がある場合、ひとつに集約されて出力されます。

投稿日時 - 2016-10-21 00:05:22

お礼

ありがとうございます。
結局結びつけでエラーを返します。
Accessのウィザードで同様に複数のフィールドを不一致クエリかけても、やはり「フィールド結合できません」となって実行自体ができません。

根本的に対応方法を考え直してまた質問してみます。
ありがとうございました。

投稿日時 - 2016-11-05 12:34:12

ANo.2

クエリを新規作成して、TBL_A, TBL_B を追加します。

.商品コード同士を結合して、結合線をダブルクリックで結合プロパティを開きます。
こそで、「'TBL_A'の全レコードを・・・・・・」というオプションを選択します。
価格同士を結合して、同様に結合プロパティを設定します。

TBL_A のフィールドは全て表示させます。
TBL_B の 商品コード の抽出条件に Is Null と設定します。
これで希望の抽出になります。

SQLなら、

SELECT TBL_A.商品コード, TBL_A.価格
FROM TBL_A LEFT JOIN TBL_B ON (TBL_A.価格 = TBL_B.価格) AND (TBL_A.商品コード = TBL_B.商品コード)
WHERE TBL_B.商品コード Is Null;

投稿日時 - 2016-10-20 01:53:18

お礼

ありがとうございます。
本番の(実際に使っている)テーブルでやってみましたが、やはり抽出もれが起こります。
コードと金額に同じものがあるようです。

投稿日時 - 2016-10-20 22:17:36

あなたにオススメの質問