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が返ってきてほしい
単純なものなのかもしれませんが、
どうか、お力添えのほど、よろしくお願いいたします。
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でデータを取るためには頭の中でどういった表を用意したら
取得できるかの妄想力が必要です。
がんばってください。
この回答への補足
お教えいただいた記述を応用して以下のようにしました。
select code, date
from DATA
where
(code, date) not in
(select code, date from DATA where status!='C')
group by code, date;
ありがとうございます。
お返事ありがとうございます。
期待通りの結果が返ってきました。
not in (select ~)
なんて考えつきませんでした・・・。
まだまだ妄想力が不足しているようです。
助かりました。
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になっちゃいますよ。
ごめんなさい、私何か間違えていたかもしれません・・・。
どこが違っているかわからないのですが・・・。
たいへん失礼いたしました - - ;
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);
こっちの方がカッコイイ(笑)
いろいろ考案していただき感謝です。
having句は私にとって新しい風でした。
とても勉強になります。
たしかにSQL文かっこよすです笑。
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);
ご回答いただきありがとうございます。
1)の方法だと、うまく値が返ってきませんでした。
and を or に変えるとAとBを含むレコードが返ってきました。
2)の方法だと、C以外を含むレコードも返ってきました。
No.1さんと同じ結果になります。
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'
さっそくありがとうございます。
私の説明が至らず、誤解させてしまってすみません。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) VS codeを使って、ラズパイ Picoを動かせる簡単な方法 1 2023/04/27 13:49
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- Visual Basic(VBA) ExcelVBA No.を自動連番で設定をしながらデータ入力をしたい 2 2022/08/03 18:19
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL update方法
-
副問合せにLIKE文を使う方法は...
-
oracleの直接接続のクライアン...
-
オラクルのビューの存在について
-
sqlplusで接続できない
-
質問です。 下記のテーブルとデ...
-
ORCALE SQL 複数のGROUP BY
-
ORA-14452について
-
select for updateのロック
-
SQLの中上級者へのレベルアップ...
-
[Oracle] UPDATE分の副問い合わ...
-
パソコンで core i3-7020u と c...
-
ワークテーブルって何?
-
複数レコードの完全一致
-
oracleのimpdpでORA-39166
-
sqlで質問です。 Aテーブルは店...
-
SELECTによる表の変換方法を教...
-
開発対象となるアプリケーショ...
-
Oracleですがsqlで質問です。 ...
-
sqlで質問です。 Aテーブルの登...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名が可変の動的SQLをフ...
-
実行時エラー:2517 プロシージ...
-
CPRM decrypterのエラーコード...
-
B4サイズは?mmx?mmですか?
-
Oracl[10g]の SQL文について(No.8)
-
Activation codeとは
-
翻訳お願いします 日→英
-
オシロスコープYOKOGAWA DL708...
-
JIS地域コード
-
オラクルDBでの不一致の検索
-
PostgreSQL : 多値従属性(第四...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
おすすめ情報