- ベストアンサー
ACCESS クエリでの抽出の方法について
毎度お世話になっております。 ACCESS2003、SQLSERVER2000を使用しています。 以下のテーブルがあります。 テーブル1 フィールド1 フィールド2 A 10 A 20 A -10 B 1 B 2 B 3 フィールド1をグループ化し、 フィールド2に0より小さい数がある場合はNG、 ない場合はOKと表示したいのです。 希望する結果 フィールド1 フィールド2 A NG B OK 私が考えた方法は、 1.クエリ1(フィールド2が0以下のフィールド1を抽出する)を作成 2.テーブル1とクエリ1をLEFT JOINし、IS NULL ならOK、そうでないならNGを表示 としました。希望した結果は得られましたが、 もっとスマートな方法(一つのクエリでできるような方法)、 または別解をご教授ください。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SQLServer では、 SELECT フィールド1, CASE WHEN MIN(フィールド2) < 0 THEN 'NG' ELSE 'OK' END AS 結果 FROM テーブル1 GROUP BY フィールド1 フィールド1 結果 A NG B OK Accessは、CASEが使えませんので、IIFを使います。
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1415)
一例です。 SELECT フィールド1,IIf(SUM(IIf(フィールド2<0,1,0))=0,"OK","NG") FROM テーブル1 GROUP BY フィールド1 (1)IIf(フィールド2<0,1,0) フィールド2が負なら1、0以上は0を返す。 (2)SUM(~) 上記結果を集計する。グループ内に負があれば1以上になる。 (3)IIf(~) SUM()の結果が0なら"OK"、1以上は"NG" でも、別クエリでやる方法がスマートではないとは思えません。 質問者の方法は一般的な方法で、それが一番良いように思います。 どうしても1クエリでやるなら、()を使う方法があります。 SELECT A.フィールド1,IIf(IsNull(B.フィールド1),"OK","NG") FROM テーブル1 AS A LEFT JOIN (SELECT フィールド1 FROM テーブル1 WHERE フィールド2<0) AS B ON A.フィールド1=B.フィールド1 GROUP BY A.フィールド1
お礼
回答ありがとうございます。 IIF関数を使うのですね。 勉強になります。 >でも、別クエリでやる方法がスマートではないとは思えません。 >質問者の方法は一般的な方法で、それが一番良いように思います。 初心者、独学の私にはとてもうれしいお言葉です。 ありがとうございます。
お礼
回答ありがとうございます。 MIN関数は今まで使ったことがありませんでした。 SELECT テーブル1.フィールド1, iif(Min(テーブル1.フィールド2)<0,"ng","ok") AS フィールド2の最小 FROM テーブル1 GROUP BY テーブル1.フィールド1; でできました。 ありがとうございました。