selectの書き方を教えてください

このQ&Aのポイント
  • Oracleで指定の条件でSELECT文を作成する方法を教えてください。
  • 以下のデータから、指定の条件でコードをSELECTしてくるSQL文を作成したいです。
  • 条件1では、3-15の日付においてstatusがAとBを持つcodeを返したいです。条件2では、3-15の日付においてstatusにCを持ち、AとBを持たないcodeを返したいです。
回答を見る
  • ベストアンサー

selectの書き方を教えてください

Oracleで以下のデータから1)、2)の条件でコードをselectしてくるには どのようなSQL文を書けばよいでしょうか。 [DATA] code date status  0001 3-15 A 0001 3-15 B 0001 3-15 C 0002 3-15 A 0002 3-15 B 0003 3-15 B 0004 3-15 A 0005 3-15 C 1)3-15においてstatusがAとBを持つcodeを返したい  →0001,0002が返ってきてほしい 2)3-15においてstatusにCを持つがそれ以外(A,B)は持たないcodeを返したい  →0005が返ってきてほしい 単純なものなのかもしれませんが、 どうか、お力添えのほど、よろしくお願いいたします。

  • Oracle
  • 回答数7
  • ありがとう数7

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

  • ベストアンサー
  • bitsu
  • ベストアンサー率34% (39/113)
回答No.2

>1)3-15においてstatusがAとBを持つcodeを返したい > > →0001,0002が返ってきてほしい select code from DATA d1,DATA d2 where d1.status = 'A' and d2.status = 'B' and d1.date = '3-15' and d1.code = d2.code and d1.date = d2.date >2)3-15においてstatusにCを持つがそれ以外(A,B)は持たないcodeを返したい > > →0005が返ってきてほしい select code from DATA where status = 'C' and code not in(select code from DATA where status in('A','B')) and date = '3-15' で取れると思います。 SQLでデータを取るためには頭の中でどういった表を用意したら 取得できるかの妄想力が必要です。 がんばってください。

duowhite
質問者

お礼

お返事ありがとうございます。 期待通りの結果が返ってきました。 not in (select ~) なんて考えつきませんでした・・・。 まだまだ妄想力が不足しているようです。 助かりました。

duowhite
質問者

補足

お教えいただいた記述を応用して以下のようにしました。 select code, date from DATA where (code, date) not in (select code, date from DATA where status!='C') group by code, date; ありがとうございます。

その他の回答 (6)

  • dda167
  • ベストアンサー率76% (55/72)
回答No.7

いちお~こちらのかんきょう(10gXE)でかくにんしてますけど~(笑) SQL> with data as ( 2 select '0001' code, '3-15' "date", 'A' status from dual union all 3 select '0001' , '3-15' , 'B' from dual union all 4 select '0001' , '3-15' , 'C' from dual union all 5 select '0002' , '3-15' , 'A' from dual union all 6 select '0002' , '3-15' , 'B' from dual union all 7 select '0003' , '3-15' , 'B' from dual union all 8 select '0004' , '3-15' , 'A' from dual union all 9 select '0005' , '3-15' , 'C' from dual 10 ) 11 select code from data 12 where "date" = '3-15' 13 group by code 14 having 15 0 < sum(case when status = 'A' then 1 else 0 end) 16 and 17 0 < sum(case when status = 'B' then 1 else 0 end); CODE -------- 0001 0002 SQL> with data as ( 2 select '0001' code, '3-15' "date", 'A' status from dual union all 3 select '0001' , '3-15' , 'B' from dual union all 4 select '0001' , '3-15' , 'C' from dual union all 5 select '0002' , '3-15' , 'A' from dual union all 6 select '0002' , '3-15' , 'B' from dual union all 7 select '0003' , '3-15' , 'B' from dual union all 8 select '0004' , '3-15' , 'A' from dual union all 9 select '0005' , '3-15' , 'C' from dual 10 ) 11 select code from data 12 where "date" = '3-15' 13 group by code 14 having 15 0 < sum(case when status = 'C' then 1 else 0 end) 16 and 17 0 = sum(case when status = 'C' then 0 else 1 end); CODE -------- 0005 1)でandをorに変えると別のSQLになっちゃいますよ。

duowhite
質問者

お礼

ごめんなさい、私何か間違えていたかもしれません・・・。 どこが違っているかわからないのですが・・・。 たいへん失礼いたしました - - ;

  • dda167
  • ベストアンサー率76% (55/72)
回答No.6

再アップ 2) select code from data where date = '3-15' group by code having 0 < sum(case when status = 'C' then 1 else 0 end) and 0 = sum(case when status = 'C' then 0 else 1 end); こっちの方がカッコイイ(笑)

duowhite
質問者

お礼

いろいろ考案していただき感謝です。 having句は私にとって新しい風でした。 とても勉強になります。 たしかにSQL文かっこよすです笑。

  • dda167
  • ベストアンサー率76% (55/72)
回答No.5

別の切り口 1) select code from data where date = '3-15' group by code having 0 < sum(case when status = 'A' then 1 else 0 end) and 0 < sum(case when status = 'B' then 1 else 0 end); 2) select code from data where date = '3-15' group by code having 0 < sum(case when status = 'C' then 1 else 0 end) and 0 = sum(case when status <> 'C' then 1 else 0 end);

duowhite
質問者

お礼

ご回答いただきありがとうございます。 1)の方法だと、うまく値が返ってきませんでした。 and を or に変えるとAとBを含むレコードが返ってきました。 2)の方法だと、C以外を含むレコードも返ってきました。 No.1さんと同じ結果になります。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.4

No2さんのでOKでしょうか。こういう条件はやったことないので申し訳ない。

duowhite
質問者

お礼

お気遣いいただきありがとうございます。 また、よろしくお願いいたします ^ ^

  • bitsu
  • ベストアンサー率34% (39/113)
回答No.3

ごめんなさい 1)ですが select code ではなく select d1.code ですね^^; 失礼しました。

duowhite
質問者

お礼

ご丁寧にありがとうございます。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

1)select code from table where date='3-15' and status in('A','B') 2)select code from table where date='3-15' and status ='C'

duowhite
質問者

お礼

さっそくありがとうございます。 私の説明が至らず、誤解させてしまってすみません。 1)の書き方だと次のように返ってきます。  code   0001  0001  0002  0002  0003  0004 0003はAを含まない、0004はBを含まないので、欲しい情報には該当しません。 あと、これは書かなかったのですが、同一コードは返ってほしくないです。  code   0001  0002 と返ってほしいのですが、なんとか伝わりますでしょうか・・・? また、2)も同様で、  code   0001  0005 と返ってしまい、0001にはAもBも含むため、 今回欲しい情報には該当しません。こちらも、  code   0005 と返ってほしいです。 誤解のある書き方で大変お手数をおかけしました。 申し訳ありませんが、もう一度ご教授いただけますと助かります。 よろしくお願いします。

関連するQ&A

  • sql select文の作り方で困っています

    C#2010で作ったアプリ から sql サーバー2008のデータベースにselect文を発行する際に困っています 検索キーワードが3つあるのですが、3つのキーワードの組み合わせでselect文を発行したいのですが、種類がたくさんできてしまい 困っています 例えば、検索キーワード A、B、Cの3つとすると、以下の組み合わせで7種類ものselect文を作るのが煩わしいです GetData(A) GetData(B) GetData(C) GetData(A,B) GetData(A,C) GetData(B,C) GetData(A,B,C) これらを1つのselect文でさばくには、どうすれば良いでしょうか? ご指導よろしくお願いいたします

  • セレクト文について

    sqlのセレクト文について質問させて下さい。 フィールドのレコードに、a,b,c,d,eと登録されているデータから、"c"のデータだけをセレクト対象にしたい場合、どのようにsqlを書けばよいのでしょうか? 通常のセレクト文だと、WHERE句に、(フィールド名 = '値')などで格納されている値とデータの比較ができるかと思うのですが、上記のような場合はどのように指定するのでしょうか? フィールドを無駄に増やし過ぎないよう、カテゴリごとに配列をjoinでまとめたものをDBへ登録しているのですが、この場合だとイメージしているようなことは無理なんでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • SQL(SELECT文)を教えてください

    SQL Serverを勉強中です。 以下のようなテーブルに、同一の日付に複数の名称・値のセットが存在します。 Date(日付)  Name(名称) Value(値) 20130101      a      10 20130101      b      20 20130101      c      30 20130202      a      5 20130202      b      10 20130202      c      15 このデータを、SQLのSELECT文で取得し、以下のような表を作りたいと考えています。 a b c 20130101 10 20 30 20130202 5 10 15 行が日付、列が名称になっています。 このように取得できるSQL文を教えてください。よろしくお願いします。

  • 条件付ソートについて

    SQL文で条件付のソートについて教えてください。 テーブルA(id, data_a, data_b)があったとき、 data_aとdata_bのうち、値が大きいほうのデータでソートするためのSQL文が知りたいのです。 例えば以下のようなデータが入っていたとき、 id,date_a,date_b 1, 10, 0 2, 20, 40 3, 30, 30 4, 90, 15 以下のような結果になるようにソートしたいのです。 id,date_a,date_b 1, 10, 0 3, 30, 30 2, 20, 40 4, 90, 15 良い方法があれば教えてください。 よろしくお願いします。

  • select文について

    現在、"user"というテーブルに"id"と"date(datetime)"という項目があり、その"date"にあるデータの中から月を指定して抽出したくて以下ようなSQL文を書いたのですがうまくいきません。 SELECT `id` FROM `user` WHERE convert((SELECT extract(month from `date`) FROM `user`), INTEGER) = 9 mysql5.0です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • ACCESSでのUPDATEコマンド

    現在ASPとACCESSを使用して、開発を行っています。 ORACLEでの開発経験はあるのですが、SQLServerやACCESSでの経験がなく微妙にことなるSQLに困惑しています。 ORACLEではUPDATE時に他のテーブルからデータを参照して更新できると思いますがACCESSで同じようなことはできるのでしょうか?実行したいのはORACLEでいう、以下のようなSQLです。 SQLを2回に分けて実行すれば同じことはできるのですが・・・。 UPDATE TAB_A SET (A,B) = (SELECT A1,B1 FROM TAB_B WHERE C1='10') WHERE C = '10'; 宜しくお願いします。

  • select for updateのロック

    オラクルのselect for updateでロックをするタイミングがいつですか? こんなPL/SQLのコードがあったとします。 ---↓↓↓ソースコードここから↓↓↓------------------------- select * from テーブル1 where id = 1 for update; ・・・・・(a) ~ update テーブル1 set kingaku=100 where id = 1 ・・・・・(b) ~ commit; ---↑↑↑ソースコードここまで↑↑↑------------------------- id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。

  • SELECT文のWHERE句についてご教授下さい。

    SELECT文のWHERE句についてご教授下さい。 ┏━┳━━━━┳━━━━┳━━━━┳━━━━┓ ┃No┃パターン_┃データA__┃データB__┃データC__┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃01┃001_________┃P1だけ___┃NULL_____┃共通________┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃02┃001_________┃P1のみ___┃NULL_____┃共通_______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃03┃002_________┃NULL_____┃P2だけ___┃NULL______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃04┃002_________┃NULL_____┃P2のみ___┃共通_______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃05┃002_________┃NULL_____┃P2のみ___┃NULL______┃ ┣━╋━━━━╋━━━━╋━━━━╋━━━━┫ ┃06┃003_________┃HOGE11_┃NULL______┃共通_______┃ ┗━┻━━━━┻━━━━┻━━━━┻━━━━┛ 上記のようなテーブル構造のデータがあり、 それぞれのカラムに対して検索できるWebの画面があります。 以下の要件を満たすSELECT文はどのように作成すればよいでしょうか? パターン「001」の場合だけ、データA列を検索条件に加える。 パターン「002」の場合だけ、データB列を検索条件に加える。 全パターン共通して、データC列は検索条件に加える。 【具体例】  以下の検索条件が指定された場合は、No「01と04と06」がHITする。   パターン=「001、002、003」   データA=「P1だけ」   データB=「P2のみ」   データC=「共通」

  • VB.NETでDataTableにデータ追加したい

    VisualStugio.Net2003でソースコードを記述しており、コード内でSQLのSELECT文を実行して、実行結果をDataTableに格納する処理をしています。 今回、とあるテーブルに対し2パターンのSQLを実行し、それぞれの実行結果を1つのDataTableに格納したいのですが、どのようにすれば良いでしょうか? 自分で調べたところ、先に実行したSQL結果に、後から実行したSQL結果を1行ずつ追加するといった方法は見つかりましたが、1行ずつではなく、一括で追加する方法が知りたいです。 前提として、2回のSQL実行では、同じテーブルの同じ項目をSELECTしております。 下記に簡単ですがコード記述の概要を補足しておきます。 ・コード記述概要 【変数宣言】 Dim DB1 As DataTable Dim DB2 As DataTable 【SQL文1】 SELECT A,B,C FROM テーブル1 WHERE 条件文1 DB1 = SQL文1の実行結果 【SQL文2】 SELECT A,B,C FROM テーブル1 WHERE 条件文2 DB2 = SQL文2の実行結果 【DB1にDB2のデータを追加】←ここのやり方を知りたいです DB1 = DB1 + DB2 よろしくお願いいたします。

  • select文

    お世話になります。 以下のような内容のテーブルA、B、Cがあります。 テーブルA  id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N テーブルAとテーブルCは「id」がキーで1:N このような3のテーブルで idを検索キーにして次のフィールドのデータを抽出したいのですが。。。(テーブルCのc_dateを降順で) id a_data a_date テーブルBのidで検索したレコード数 説明不足かもしれませんがよろしくお願いします。