selectの書き方を教えてください
- 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が返ってきてほしい 単純なものなのかもしれませんが、 どうか、お力添えのほど、よろしくお願いいたします。
- duowhite
- お礼率100% (46/46)
- Oracle
- 回答数7
- ありがとう数7
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>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でデータを取るためには頭の中でどういった表を用意したら 取得できるかの妄想力が必要です。 がんばってください。
その他の回答 (6)
- dda167
- ベストアンサー率76% (55/72)
いちお~こちらのかんきょう(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になっちゃいますよ。
お礼
ごめんなさい、私何か間違えていたかもしれません・・・。 どこが違っているかわからないのですが・・・。 たいへん失礼いたしました - - ;
- dda167
- ベストアンサー率76% (55/72)
再アップ 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); こっちの方がカッコイイ(笑)
お礼
いろいろ考案していただき感謝です。 having句は私にとって新しい風でした。 とても勉強になります。 たしかにSQL文かっこよすです笑。
- dda167
- ベストアンサー率76% (55/72)
別の切り口 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);
お礼
ご回答いただきありがとうございます。 1)の方法だと、うまく値が返ってきませんでした。 and を or に変えるとAとBを含むレコードが返ってきました。 2)の方法だと、C以外を含むレコードも返ってきました。 No.1さんと同じ結果になります。
- maiko0318
- ベストアンサー率21% (1483/6970)
No2さんのでOKでしょうか。こういう条件はやったことないので申し訳ない。
お礼
お気遣いいただきありがとうございます。 また、よろしくお願いいたします ^ ^
- bitsu
- ベストアンサー率34% (39/113)
ごめんなさい 1)ですが select code ではなく select d1.code ですね^^; 失礼しました。
お礼
ご丁寧にありがとうございます。
- maiko0318
- ベストアンサー率21% (1483/6970)
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'
お礼
さっそくありがとうございます。 私の説明が至らず、誤解させてしまってすみません。 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 Server
- セレクト文について
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 Server
- 条件付ソートについて
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 良い方法があれば教えてください。 よろしくお願いします。
- ベストアンサー
- PostgreSQL
- 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)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。
- 締切済み
- Oracle
- 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=「共通」
- ベストアンサー
- PostgreSQL
- 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 よろしくお願いいたします。
- ベストアンサー
- Visual Basic
- 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で検索したレコード数 説明不足かもしれませんがよろしくお願いします。
- 締切済み
- MySQL
お礼
お返事ありがとうございます。 期待通りの結果が返ってきました。 not in (select ~) なんて考えつきませんでした・・・。 まだまだ妄想力が不足しているようです。 助かりました。
補足
お教えいただいた記述を応用して以下のようにしました。 select code, date from DATA where (code, date) not in (select code, date from DATA where status!='C') group by code, date; ありがとうございます。