• ベストアンサー
  • すぐに回答を!

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です。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数34
  • ありがとう数1

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

  • ベストアンサー
  • 回答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;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連する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を使用しています。

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

    下記のようなレコードを持つテーブル(仮に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を使う必要があるというぐらいしか分かっていません。 よろしくお願いします。

  • 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)

  • 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

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

    以下にある二つのテーブル(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 ;

  • 複数JOINしているとCOUNTが正しく取得できな

    LAMP環境で開発をしています。 SQL文でCOUNTを求める際に、まとめて結果を求めようとして上手く行きません。 状況としては以下です。 テーブルdはidをkeyにa,b,c3つのテーブルとjoinしています。 id = 1の場合、テーブルa,b,cにマッチするレコードがそれぞれに4個、1個、0個あります。 ひとつひとつを SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count FROM d INNER JOIN a ON a.id = d.id WHERE d.id = 1 として結果を求めると4,1,0と出るのですが、まとめて SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count, COUNT(CASE WHEN b.name IS null THEN 1 ELSE null END) as b_count, COUNT(CASE WHEN c.name IS null THEN 1 ELSE null END) as c_count FROM d INNER JOIN a ON a.id = d.id INNER JOIN b ON b.id = d.id INNER JOIN c ON c.id = d.id WHERE d.id = 1 とすると28,5,0という値が返されます。 どのように書けば正しい4,1,0を得られるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • WHERE句でのCASEについて

    WHERE句でのCASEの使い方についてご教授下さい。 以下の3分岐でSELECTしようとしています。 項目A=1なら、 項目B / 1000=10 のデータを。 項目A=2なら、 項目C=C のデータを。 項目A=3なら、 項目B / 1000=10 かつ項目D=D のデータを。 ※しばらくPCに触れないので確認不可ですが以下は試みたい方法です。 ただ心配なのは、例えば項目A=1のときに項目B / 1000 = 10を満たすデータと満たさないデータが存在する場合、 満たすデータまでもが抽出されないのではという心配があります。 SELECT * FROM テーブル WHERE 1 = CASE WHEN 項目A=1 THEN CASE WHEN 項目B / 1000 = 10 THEN 1 ELSE END WHEN 項目A=2 THEN CASE WHEN 項目C = C THEN 1 ELSE END WHEN 項目A=3 THEN CASE WHEN 項目B / 1000 = 10 AND 項目D = D THEN 1 ELSE END ELSE END

  • 複数レコードのデータを1レコードに集約したい

    お世話になります。 複数レコードのデータを1レコードに集約したいのですが色々試してみましたが上手くいきません。 まず、以下のようなテーブルがあります。 TableA(キーはID) ID NO 1, 2 TableB(キーはIDとNO) ID NO SYU_NO FUKU_NO 1, 1, 1, 1 1, 2, 1, 2 1, 3, 2, 1 2, 1, 1, null    ・    ・ TableC(キーはIDとKUBUNとNO) ID KUBUN(SYU or FUKU) NO START END KAKUNIN 1, 1, 1, 20090101, 20091231, 20090310 1, 1, 2, 20090201, 20091130, 20090310 1, 2, 1, 20090401, 20100331, 20090312    ・    ・ これを、以下のようなレコードにしたいのですが・・。 ID START(SYU_NO) END(FUKU_NO) START(FUKU_NO) END(FUKU_NO) 1, 20090101, 20091231, 20090401, 20100331 以下のようなselect文を作成しましたが・・。 select A.ID || ',' || case when C.KUBUN = 1 then C.START end || ',' || case when C.KUBUN = 1 then C.END end || ',' || case when (C.KUBUN = 2 and B.FUKU_NO = C.NO) then C.START end || ',' || case when (C.KUBUN = 2 and B.FUKU_NO = C.NO) then C.END end || ',' || from TableA A inner join TableB B on A.ID = B.ID and A.NO = B.NO inner join TableC C on B.ID = C.ID and ((C.KUBUN = 1 and B.SYU_NO = C.NO) or (C.KUBUN = 2 and B.FUKU_NO = C.NO)) ; 以下のような結果が返ってきます。 ID START(SYU_NO) END(FUKU_NO) START(FUKU_NO) END(FUKU_NO) 1, 20090101, 20091231, , 1, , , 20090401, 20100331 実は別サイトでも投稿しておりますが回答がなく大変困っております。 どうか宜しくお願い致します。

  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • 2つのテーブルからレコードを抽出する方法

    お世話になります。MySQLに関する質問です。 TABLE1とTABLE2の2つのテーブルからレコードを抽出する際、 TABLE1からは全項目のデータを取得し、TABLE2からは一部の項目の データを取得したいと考えています。 条件は、TABLE1とTABLE2を[No]という項目の値で紐(ひも)づけます。 (1) SELECT * FROM TABLE1 (2) SELECT COL_A, COL_B, COL_C FROM TABLE2 上記(1)(2)のレコードを1つのSQLで取得する方法について、どなたかご教授願えますか?

    • ベストアンサー
    • MySQL