2つの条件を満たすレコードのカラムを抽出する方法

このQ&Aのポイント
  • 特定のテーブルから2つの条件を満たすレコードのカラムを抽出する方法について詳しく教えてください。
  • 条件1および条件2を満たすレコードのid1を抽出するためのSQL文についてアドバイスをいただきたいです。
  • 使用バージョンは7.4.19です。よろしくお願いします。
回答を見る
  • ベストアンサー

2つの条件を満たすのレコードのカラムを抽出する方法について

下記のテーブルがあったとします。 【t_tblテーブル】 ――――――――――――― |id1  |id2 |id3  | ――――――――――――― |1   |1  |10   | |1   |2  |12   | |1   |3  |9   | |1   |4  |8   | |1   |5  |14   | |2   |1  |14   | |2   |2  |8   | |2   |3  |9   | |2   |4  |12   | |2   |5  |10   | |3   |1  |4   | |3   |2  |2   | |3   |3  |3   | |3   |4  |5   | |3   |5  |6   | |4   |1  |6   | |4   |2  |5   | |4   |3  |3   | |4   |4  |2   | |4   |5  |4   | ――――――――――――― このテーブルの特定のレコードを抽出する為に、 2つパラメータを渡すとします。 1. 12 2. 8 そして下記の条件を満たすレコードのid1を抽出したいと思います。 1. 「id3」 = 「12」 かつ 「id3」 = 「8」 を満たすid1 (※この時点で1と2がヒットします) 2. 条件1を満たした上で、「12」のid2 < 「8」のid2 (※この時点で1のみヒットします) 下記のSQLで条件1を満たせる事は確認しましたが、 条件2を満たす方法が分かりませんでしたので、 アドバイスいただける方がいらっしゃいましたら、 ご教示いただきたいと思います。 select id1 from t_tbl group by id1 Having SUM(CASE WHEN id3=12 Then 1 Else 0 End)>0 And SUM(CASE WHEN id3=8 Then 1 Else 0 End)>0 使用バージョンは7.4.19です。 よろしくお願いします。

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

  • ベストアンサー
  • yasumitu
  • ベストアンサー率100% (5/5)
回答No.1

読みにくいですけどこれで求められるようです。 試したのは8.3.5 ですが、たぶん7.4でもいけるはず。 select tbl.id1 from ((select id1 as id,id2 as id2_0 from t_tbl where id3 = 12) as t12 left outer join (select id1,id2 from t_tbl where id3 = 8) as t8 on (t12.id=t8.id1)) as tbl where tbl.id2_0 < tbl.id2;

iroha_168
質問者

お礼

ご教示いただいた記述を試させて頂いた所、意図した動作となりました。 書いてある内容も何となくですが理解できたと思います。 どうもありがとうございました。

関連するQ&A

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • CASE式を使ったクエリ

    <環境>SQLSERVER2005 件名について教えてください。 テーブル("TBL")にフィールドMONEY1~MONEY12までがあります。 MONEYの後ろの数字は月を表しています。 このテーブルから 1.MONEY12の値≠0円ならMONEY12の値。MONEY12の値=0円ならMONEY11の値を参照。 2.MONEY11の値≠0円ならMONEY11の値。MONEY11の値=0円ならMONEY10の値を参照。 3.MONEY10の値≠0円ならMONEY10の値。MONEY10の値=0円ならMONEY9の値を参照。 と0円でない月までさかのぼってその月の金額を求めたいのですが、 下記のようにCASE式を使うと「Case 式は、10 レベルまでしか入れ子にできません。」と エラーになります。 条件式が11レベル以上の場合抽出する方法はないのでしょうか SELECT CASE WHEN MONEY12>0 THEN MONEY12 ELSE CASE WHEN MONEY11>0 THEN MONEY11 ELSE CASE WHEN MONEY10>0 THEN MONEY10 ELSE CASE WHEN MONEY9>0 THEN MONEY9 ELSE CASE WHEN MONEY8>0 THEN MONEY8 ELSE CASE WHEN MONEY7>0 THEN MONEY7 ELSE CASE WHEN MONEY6>0 THEN MONEY6 ELSE CASE WHEN MONEY5>0 THEN MONEY5 ELSE CASE WHEN MONEY4>0 THEN MONEY4 ELSE CASE WHEN MONEY3>0 THEN MONEY3 ELSE CASE WHEN MONEY2>0 THEN MONEY2 ELSE CASE WHEN MONEY1>0 THEN MONEY1 ELSE 0 END END END END END END END END END END END END FROM TBL

  • PostgresqlのCASE分の使い方

    SELECT MAX(CASE WHEN fld IS NULL THEN 0 ELSE fld END) FROM tbl ; tblテーブルのfldの最大値を取得するSQLを作りたいのですが、tblテーブルにレコードが登録されていない時に「0」を出力したいと思っています。 上記のSQLだとレコードが0の場合はfldの値がないため、0を出力してくれません。 どのように修正すればレコード0件のときに「0」を出力してくれるでしょうか。 宜しくお願いします。

  • あるカラムの値を複数持つレコード以外を抽出したい

    下記のようなレコードを持つテーブル(仮にtest1)があります。 ID price type 001 2000 1 001 4000 1 002 8000 2 003 2000 1 003 8000 2 004 5000 3 ここから次の条件で抽出したいのですがSQLに明るくないためよくわかりません。 ・typeが1と2の両方を持つもの、または、3を持つものを除く ・その上でpriceの合計値をIDごとに得たい 求める結果としては、 ID price 001 6000 002 8000 を得たいのですが。 distinctを使う必要があるというぐらいしか分かっていません。 よろしくお願いします。

  • 更新クエリでの抽出条件の設定がわかりません

    お世話になります。 Access2010を使っています。 今、TBL_1の社員コードの中で、期間2の日付を、TBL_2の日付フィールドの 値に置換したいです。 TBL_1はIDをオートナンバーで振っており、置換したいレコードは社員コードID値が最大の レコード内の期間2フィールドになります。TBL_2は全社員コードはなく、社員 コードがある場合のみTBL_1の期間2を置換します。 テーブル1名:TBL_1 ID 社員コード 期間1   期間2   1  00123   2012/6/30  2014/3/31 2  00123   2014/4/1   2015/3/31 3  00456   1995/9/15  2008/3/31 4  00789   2001/6/2  2013/3/31  ・ 10 00456   2008/4/1  2016/3/31  ・ 30 00789   2013/4/1  2015/3/31  ・ 50 00123   2015/4/1  2017/3/31  ・ テーブル2名:TBL_2 社員コード 日付      00123   2016/10/31  00456   2015/5/20 上の例では結果として、 IDが10のレコードの期間2を2015/5/20に置換します。 IDが50のレコードの期間2を2016/10/31に置換します。 テーブル1名:TBL_1 ID 社員コード 期間1   期間2   1  00123   2012/6/30  2014/3/31 ←変わらない 2  00123   2014/4/1   2015/3/31 ←変わらない 3  00456   1995/9/15  2008/3/31 ←変わらない 4  00789   2001/6/2  2013/3/31 ←変わらない  ・ 10 00456   2008/4/1  2015/5/20 ←期間2:2015/5/20に  ・ 30 00789   2013/4/1  2015/3/31 ←変わらない  ・ 50 00123   2015/4/1  2016/10/31 ←期間2:2016/10/31に 更新クエリを使えばいいと思っていますが、抽出条件をどのように 書いていいのかわかりません。 恐れ入りますが、宜しくお願い申し上げます。

  • 講座のある日を抽出したい

    以下にある二つのテーブル(coursemaster, opencourses)を結合して 月ごとに講義があるかをo,xで一覧にして[期待結果]の様な表を抽出したいです。 coursemaster テーブル course_id | course_name 1 | 経理講義 2 | 財務講義 3 |  簿記講義 4 | 税理講義 opencoursesテーブル   month course_id 200706 | 1      200706 | 3 200706 | 4 200707 | 4 200708 | 2 200708 | 4 [期待結果]      経理講義 財務講義  簿記講義  税理講義 200706  ○      ×     ○      ○ 200707  ×      ×     ×      ○ 200708  ×      ○     ×      ○ 以下の様なSQL文で表を結合してみたのですが 日付の値が重複されてしまい、期待通りの結果になりません。 誰かご教授いただけないでしょうか? SELECT month AS 開講日 ,CASE WHEN course_name='経理講義' THEN '○' ELSE '×' END AS 経理講義 ,CASE WHEN course_name='財務講義' THEN '○' ELSE '×' END AS 財務講義 ,CASE WHEN course_name='簿記講義' THEN '○' ELSE '×' END AS 簿記講義 ,CASE WHEN course_name='税理講義' THEN '○' ELSE '×' END AS 税理講義 FROM OpenCourses AS OC INNER JOIN CourseMaster AS CM ON OC.course_id = CM.course_id ORDER BY 1 ;

  • 【Access】条件未入力時、全件ヒットするクエリについて

    下記のテーブルがある場合、下記のクエリを実行すると、下記のような結果になります。 条件1. [Forms]![F_Form]![name]に「ル」と入力 →「ベルト」のレコードを抽出 条件2. [Forms]![F_Form]![name]に何も入力しない。 →「ベルト」「ニット」「ズボン」のレコードを抽出 【クエリ】 SELECT * FROM TBL WHERE (((TBL.NAME) Like IIf(Nz([Forms]![F_Form]![name])='','*','*'+Nz([Forms]![F_Form]![name])+'*'))); 【テーブル(TBL)の中身】 ID NAME 1 ベルト 2 ニット 3  4 ズボン 条件1は意図した動作となっていますが、 条件2は意図した動作をしませんでした。 条件2の場合、全件ヒットしたいと思います。 ただ、上記のクエリではNAME列に値が入っていないID=3の値が抽出できませんでした。 その為、条件2の場合、全件ヒットするクエリの書き方をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

  • CASE文について

    <環境> SQLSERVER2005 ACCESS2007 CASE文について質問です。 クエリで下記のSQL文を実行すると、「Case 式は、10 レベルまでしか入れ子にできません。」 とエラーになります。 このような場合、どのように記述すれば解決できるでしょうか? ご教授お願いします。 SELECT CASE WHEN (WA.MM = '01') THEN ROUND(SUM(WB.MONEY1), -3, 0) ELSE CASE WHEN (WA.MM = '02') THEN ROUND(SUM(WB.MONEY2), -3, 0) ELSE CASE WHEN (WA.MM = '03') THEN ROUND(SUM(WB.MONEY3), -3, 0) ELSE CASE WHEN (WA.MM = '04') THEN ROUND(SUM(WB.MONEY4), -3, 0) ELSE CASE WHEN (WA.MM = '05') THEN ROUND(SUM(WB.MONEY5), -3, 0) ELSE CASE WHEN (WA.MM = '06') THEN ROUND(SUM(WB.MONEY6), -3, 0) ELSE CASE WHEN (WA.MM = '07') THEN ROUND(SUM(WB.MONEY7), -3, 0) ELSE CASE WHEN (WA.MM = '08') THEN ROUND(SUM(WB.MONEY8), -3, 0) ELSE CASE WHEN (WA.MM = '09') THEN ROUND(SUM(WB.MONEY9), -3, 0) ELSE CASE WHEN (WA.MM = '10') THEN ROUND(SUM(WB.MONEY10), -3, 0) ELSE CASE WHEN (WA.MM = '11') THEN ROUND(SUM(WB.MONEY11), -3, 0) ELSE CASE WHEN (WA.MM = '12') THEN ROUND(SUM(WB.MONEY12), -3, 0) END END AS MONEY FROM (WA INNER JOIN WB ON (WA.YYYY = WB.YYYY)) INNER JOIN WC ON (WA.YYYY = WC.YYYY)

  • SQLのグループ化動作について

    グループ化と集計関数の動作について質問させてください。 MySQL、SQLiteて実行しました。 [テーブル:ninzu_tbl] ken sex ninzu 福岡 1 50 福岡 2 60 佐賀 1 40 佐賀 2 30 長崎 1 60 長崎 2 50 性別(sex)でgroup byして人数を求めるSQLを実行した場合、 sumを使用するSQL(1)を実行すると福岡、佐賀、長崎のそれぞれの人数が表示されますが、 sumを使用しないSQL(2)を実行した場合、長崎の人数のみが表示され、福岡、佐賀の人数が 空白になります。 group byでグループ化した場合に、最後尾のキー項目以外のデータが 上書きされ、福岡、佐賀のデータが飛んでしまったのではと考えましたが、 (1)を実行した場合に県ごとのデータが表示される理由がわかりません。 理由がわかる方、教えていただけませんか? もしくは、グループ化の処理イメージができるサイトを教えてください。 よろしくお願いします。 (1) 結果が表示されるSQL select sex as '性別' , sum(case when ken = '福岡' then ninzu else null end) as '福岡' , sum(case when ken = '佐賀' then ninzu else null end) as '佐賀' , sum(case when ken = '長崎' then ninzu else null end) as '長崎' from ninzu_tbl group by sex (2) 福岡と佐賀の結果が表示されないSQL select sex as '性別' , case when ken = '福岡' then ninzu else null end as '福岡' , case when ken = '佐賀' then ninzu else null end as '佐賀' , case when ken = '長崎' then ninzu else null end as '長崎' from ninzu_tbl group by sex

  • 複数条件でのレコード抽出について

    いつも大変お世話になっています。 複数条件でのレコード抽出で教えていただけますでしょうか? 下記のようなサンプルコードを見つけ、実際に抽出できることを確認しました。 ただ、テーブル名:学生名簿の 身長と体重のデータ型が数値型である必要が あるようで、他の型では Set rs = CurrentDb.OpenRecordset(SQL) でエラー となってしまいます。テキスト型の入力でエラーが出ないように記述するには どうしたらよいのでしょうか? Access2010、Win7を使用しています。 サンプルコードは身長と体重を入力し、条件にあった内容をテキスト1に出力する コードです。 ーーサンプルコードーー Option Compare Database Private Sub コマンド8_Click() Dim SQL As String Dim rs As Recordset If IsNull(Me!テキスト2) Then MsgBox "抽出する身長を入力してください。" Me!テキスト2.SetFocus Exit Sub End If If IsNull(Me!テキスト3) Then MsgBox "抽出する体重を入力してください。" Me!テキスト3.SetFocus Exit Sub End If Me!テキスト1 = Null SQL = "SELECT 学生ID,身長,体重 FROM 学生名簿 WHERE 体重>=" & Me!テキスト3 & " AND 身長>=" & Me!テキスト2 Set rs = CurrentDb.OpenRecordset(SQL) Do Until rs.EOF Me!テキスト1 = Me!テキスト1 & rs![学生ID] & ": " & rs![身長] & " " & rs![体重] & vbCrLf rs.MoveNext Loop Set rs = Nothing End Sub