人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

AccessでのSQLについて教えてください。TABLE1にフィールドが3つあります。産地、果物名、果物価格。データの例は下記になります。

日本,カリン,100円○
アメリカ,アンズ,200円
フランス,アーモンド,300円
アメリカ,カリン,100円○
フランス,カリン,100円○
日本,カリン,500円×

抽出したいのは果物名です。ただし、条件が産地がアメリカ、フランス、日本の3国が登場する、AND 価格が全て同じものを抽出したいです。

上の例でいうと、カリンを抽出するとします。産地にアメリカ、フランスがあっても日本が無ければ抽出しません。同じようにカリンの果物価格が3国とも同じでなければ抽出しません。これを実現するにはどのようなSQLを書けばよいでしょうか?ちなみに産地は3国しかでてきません。必ずカリンが3国に登場して価格も同じでなければ抽出しません。


●質問者: akaired
●カテゴリ:コンピュータ
✍キーワード:access SQL アメリカ アンズ アーモンド
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● degucho
●20ポイント

いろいろあると思いますが、2000以降なら

SELECT J.果物名,J.果物価格
 FROM
((SELECT * FROM TABLE1 WHERE 産地='日本') AS J
 JOIN 
 (SELECT * FROM TABLE1 WHERE 産地='アメリカ') AS U 
 ON J.果物名 = U.果物名
 AND J.果物価格 = U.果物価格
) JOIN
(SELECT * FROM TABLE1 WHERE 産地='フランス') AS F 
 ON J.果物名 = F.果物名
 AND J.果物価格 = F.果物価格
WHERE J.果物名 IS NOT NULL
 

とかでいけるんじゃないでしょうか

◎質問者からの返答

すいません、上記を実行すると選択クエリでエラーがおこります。JOINはinner joinとなおして解決しましたが、今度はfrom句の構文エラーと表示されます。


2 ● kn1967
●20ポイント

ベタな書き方ですが国名が3つだけという事ならば、

下記のようにすれば動作確認も楽だと思います。


ステップ1 - 3カ国だけに注目

SELECT T1.*, T2.*, T3.*
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
;

ステップ2 - 果物名を加える

SELECT T1.*, T2.*, T3.*
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
 AND (T1.果物名 = T2.果物名) AND (T1.果物名 = T3.果物名)
;

ステップ3 - 果物価格を加える

SELECT T1.*, T2.*, T3.*
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
 AND (T1.果物名 = T2.果物名) AND (T1.果物名 = T3.果物名)
 AND (T1.果物価格 = T2.果物価格) AND (T1.果物価格 = T3.果物価格)
;

最終調整 - 果物名だけを出力

SELECT T1.果物名
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
 AND (T1.果物名 = T2.果物名) AND (T1.果物名 = T3.果物名)
 AND (T1.果物価格 = T2.果物価格) AND (T1.果物価格 = T3.果物価格)
;

3 ● Hibi
●20ポイント

間違っていたらごめんなさい。多分、下記SQLで良いかと。

もうちょっとスマートにすることができると思いますが。

SELECT TABLE1.果物価格 , TABLE1.果物名

FROM ((

TABLE1

LEFT JOIN (

SELECT TABLE1.*

FROM TABLE1

WHERE TABLE1.産地="日本") AS Japan

ON (TABLE1.果物価格 = Japan.果物価格) AND (TABLE1.果物名 = Japan.果物名)

)

LEFT JOIN (

SELECT TABLE1.*

FROM TABLE1

WHERE TABLE1.産地="アメリカ") AS USA

ON (TABLE1.果物価格 = USA.果物価格) AND (TABLE1.果物名 = USA.果物名)

)

LEFT JOIN (

SELECT TABLE1.*

FROM TABLE1

WHERE TABLE1.産地="フランス") AS France

ON (TABLE1.果物価格 = France.果物価格) AND (TABLE1.果物名 = France.果物名)

WHERE

Not (Japan.産地 IS Null OR USA.産地 IS Null OR France.産地 IS Null)

GROUP BY TABLE1.果物価格 , TABLE1.果物名


4 ● ken3memo
●20ポイント

>ちなみに産地は3国しかでてきません

例外無しと決め付けて(いけない考えですが・・・)、

グループ化して カウントを3のデータだけ持ってくるとか?

[f:id:ken3memo:20090729200648j:image]

SELECT TABLE1.果物名, TABLE1.果物価格

FROM TABLE1

GROUP BY TABLE1.果物名, TABLE1.果物価格

HAVING (((Count(TABLE1.産地))=3));

産地を条件に入れて、

~~~~~~~~~~~~~~~~~~~~

SELECT TABLE1.果物名, TABLE1.果物価格

FROM TABLE1

WHERE (((TABLE1.産地)="日本")) OR (((TABLE1.産地)="アメリカ")) OR (((TABLE1.産地)="フランス"))

GROUP BY TABLE1.果物名, TABLE1.果物価格

HAVING (((Count(TABLE1.産地))=3));

のほうがいいのかなぁ。

でも、単純にカウント3なので、

このクエリだと

アメリカカリン100

アメリカカリン100

フランスカリン100

と、日本が無いデータも3とカウントするから却下かなぁ。

以上、グループ化の案でした。

何かの参考となれば、幸いです。


5 ● HALSPECIAL
●20ポイント

SELECT QRY.[果物名], QRY.[果物価格]
FROM (
SELECT DISTINCT [産地], [果物名], [果物価格]
FROM [テーブル1]
) QRY
GROUP BY QRY.[果物名], QRY.[果物価格]
HAVING Sum(IIf(QRY.[産地]='アメリカ',1,IIf(QRY.[産地]='フランス',2,IIf(QRY.[産地]='日本',4,0))))=7

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ