匿名質問者

SQLの条件の書き方について。


例えば、下記サンプルで、一度でも不合格を含む人物を外して、
合格履歴しかない人物のみの履歴を抜き出す構文を教えてください。

A 合格 国語
A 合格 算数
B 不合格 国語
B 合格 算数

where 結果<>不合格
だと、Bさんの合格履歴(算数)があがってきてしまいます。
Bさんは一度不合格履歴があるので、Bさん自体の履歴全て(合格履歴も)を抜き出したくないです。

ちなみにAccessです。SQL文を直接書いて抽出しています。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2012/10/18 10:06:51

ベストアンサー

匿名回答3号 No.3

一例

SELECT 氏名
FROM テーブル
GROUP BY 氏名
HAVING SUM(IIF(結果="不合格", 1, 0)) = 0
;
匿名質問者

これを使わせて頂きました!ありがとうございます。

2012/10/18 10:06:20

その他の回答2件)

匿名回答1号 No.1

1つにまとめると、SQLの計算量・コストがかかりそうだけど、
不合格を1にして、合格を0でSUM合計をとります。

SELECT T_MOTO.名前, T_MOTO.合否, T_MOTO.科目, (SELECT Sum(IIf(T_TEMP.[合否]="不合格",1,0)) FROM TABLE_A AS T_TEMP WHERE T_TEMP.名前 = T_MOTO.名前) AS 不合格の合計
FROM TABLE_A AS T_MOTO;

↑のクエリーで下記↓のように不合格の数をカウントで来たので
f:id:ken3memo:20121015143624j:image

↑から、不合格が0の人(合格だけの人を取り出すと)
f:id:ken3memo:20121015143625j:image

SELECT T_MOTO.名前, T_MOTO.合否, T_MOTO.科目, (SELECT Sum(IIf(T_TEMP.[合否]="不合格",1,0)) FROM TABLE_A AS T_TEMP WHERE T_TEMP.名前 = T_MOTO.名前) AS 不合格の合計
FROM TABLE_A AS T_MOTO
WHERE ((((SELECT Sum(IIf(T_TEMP.[合否]="不合格",1,0)) FROM TABLE_A AS T_TEMP WHERE T_TEMP.名前 = T_MOTO.名前))=0));

かなぁ。
う~ん、なんか、もっとスッキリするような感じがするけど、
あとは、識者・SQLの魔術師さんにおまかせします。
.
叩き台、ヒントとなれば幸いです。

匿名質問者

ありがとうございます!
0,1を使うという方法は、いいきっかけになりました。今後応用します。

2012/10/18 10:01:23
匿名回答2号 No.2

select *
  from 履歴 as a
 where not exists (select b.人物 from 履歴 as b where b.結果 = '不合格' and b.人物 = a.人物)
匿名質問者

ありがとうございます。すごく勉強になります。
実際これを書いてみて、問題なく進んでいたのですが、この結果を元に新たなクエリを書いたときに、不具合が起きてしまい、自分で解決できなかったので、今回は断念します…
もう少し、勉強が進んだら、使いこなせるようにしたいです!

2012/10/18 10:05:46
匿名回答3号 No.3

ここでベストアンサー

一例

SELECT 氏名
FROM テーブル
GROUP BY 氏名
HAVING SUM(IIF(結果="不合格", 1, 0)) = 0
;
匿名質問者

これを使わせて頂きました!ありがとうございます。

2012/10/18 10:06:20

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません