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

解決済みの質問

SELECTで商品AとBを購入した得意先の抽出方法

以下のようなテーブルがある場合に、SELECT文で商品Aと商品Bを両方購入している得意先のレコードを抽出することは可能でしょうか?得意先や商品は以下に限らず複数登録されています。
いい方法がありましたら教えてください。よろしくお願いします。

URIAGE_TBL

得意先  商品 数量
---------------------
会社1   A   1   <- 抽出
会社1   B   2   <- 抽出
会社1   C   1   <- 抽出
会社2   D   1
会社3   A   2   <- 抽出
会社3   B   1   <- 抽出
会社4   A   2
会社4   C   2

投稿日時 - 2005-09-21 11:23:46

QNo.1663342

暇なときに回答ください

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

create table test (
x varchar(10),
y varchar(10),
z int
)



insert test values('会社1','A',1)
insert test values('会社1','B',2)
insert test values('会社1','C',1)
insert test values('会社2','D',1)
insert test values('会社3','A',2)
insert test values('会社3','B',1)
insert test values('会社4','A',2)
insert test values('会社4','C',2)

しておいて

SELECT a.x
  FROM test a, test b
  WHERE
    a.x = b.x AND
    a.y = 'A' AND
    b.y = 'B'

すると

x
----------
会社1
会社3

となります。

これをサブクエリに入れれば

SELECT *
  FROM test
  WHERE x IN (
    SELECT a.x
      FROM test a, test b
      WHERE
        a.x = b.x AND
        a.y = 'A' AND
        b.y = 'B'
    )



x y z
---------- ---------- -----------
会社1 A 1
会社1 B 2
会社1 C 1
会社3 A 2
会社3 B 1

となります。

ちなみに、既回答の中では回答No.2のSQLが同じ結果になります。

投稿日時 - 2005-09-21 12:23:01

お礼

できました!
なるほどですね。回答ありがとうございました!!

投稿日時 - 2005-09-21 14:05:39

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

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

回答(6)

ANo.6

#2です。

>残念ながら同じ会社で同じ商品のレコードが複数存在していました。
ということなのでちょっと修正してみました。

select * from URIAGE_TBL
where 得意先 in (
 select 得意先 from (
  select distinct 得意先,商品
  from URIAGE_TBL
 ) tmp
 where 商品 in ( 'A', 'B' )
 group by 得意先
 having count(*) >= 2
)

ちょっと長くなってしまってSQL的にどうかなとは思いますが、
これでお望みの結果は抽出できるかと

投稿日時 - 2005-09-21 13:09:56

お礼

おお。distinct で重複分を除いてから抽出するんですね。
うまくいきました!ありがとうございました~!!

投稿日時 - 2005-09-21 14:12:14

ANo.4

bdr

No.3です

サブクエリに「DISTINCT」が必要でした

SELECT 得意先,商品,数量 FROM URIAGE_TBL
WHERE 得意先 IN (SELECT DISTINCT 得意先 FROM URIAGE_TBL WHERE 商品 IN ('A','B'))

または

SELECT 得意先,商品,数量 FROM URIAGE_TBL
WHERE 得意先 IN (SELECT DISTINCT 得意先 FROM URIAGE_TBL WHERE 商品 = 'A' OR 商品 = 'B'))

投稿日時 - 2005-09-21 11:56:09

お礼

こちらも会社4まで出力されちゃいました。
でも回答ありがとうございました~。

投稿日時 - 2005-09-21 14:01:15

ANo.3

bdr

恐らく以下のSQLで大丈夫だと思います

SELECT 得意先,商品,数量 FROM URIAGE_TBL
WHERE 得意先 IN (SELECT 得意先 FROM URIAGE_TBL WHERE 商品 IN ('A','B'))

または

SELECT 得意先,商品,数量 FROM URIAGE_TBL
WHERE 得意先 IN (SELECT 得意先 FROM URIAGE_TBL WHERE 商品 = 'A' OR 商品 = 'B'))

投稿日時 - 2005-09-21 11:53:05

お礼

ありがとうございます。
でも頂いた回答だと会社4まで出力されちゃいますね。。

投稿日時 - 2005-09-21 13:02:49

ANo.2

ある会社についてある商品のレコードが複数存在しない
という条件であれば以下のSQLで抽出できるかな?

select * from URIAGE_TBL
where name in (
select name from URIAGE_TBL
where data in ( 'A', 'B' )
group by name
having count(*) >= 2
)

SQLの意味ですが、まず会社毎に商品がAまたはBのレコードを抽出して、
2件以上(AもBもある)会社を抽出します。
その会社名と一致するデータを元のテーブルから抽出します。

でも・・件数が多くなると遅くなるかなぁ・・・

投稿日時 - 2005-09-21 11:52:11

お礼

残念ながら同じ会社で同じ商品のレコードが複数存在していました。
情報不足ですみません。。。回答ありがとうございました!

投稿日時 - 2005-09-21 13:01:40

ANo.1

select * from
(select * from URIAGE_TBL where 商品 = 'A')
where 商品 = "B";
;
これで行けないでしょうか。

投稿日時 - 2005-09-21 11:41:57

お礼

ありがとうございます。
でもこれだとレコードが1件も抽出されません。。。

投稿日時 - 2005-09-21 12:56:15

あなたにオススメの質問