🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

498閲覧

条件付きでのグループ数の検索について

yuujiMotoki

総合スコア90

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/02/24 12:45

#テーブル

下記のようなテーブルがあります。

CLASS NAME
xxx a
xxx b
xxx c
xxx d
yyy b
yyy c
yyy d
zzz c
zzz d
zzz e
www e
www f
www g

#課題

差し当たり、下記の条件に該当するSQLが書けなくて困っています。

1)NAMEにaまたはbを含むCLASS 
WHERE IN (a,b) → xxx,yyy → OK
これは問題ありませんでした。

2)NAMEにa、bどちらも含まないCLASS
WHERE NOT IN (a,b) → xxx,yyy,zzz,www → NG
正解はZZZ,WWW

#質問

2)の答えとしては、1)と反対の集合になります。
NOT IN では無理でした。
a,bは数が増える可能性がありますので、IN節のように、スマートに書きたいです。

何か良い方法があれば教えてください。

SQL

1select distinct t.class as cls from test as t 2where t.name in ('a','b') 3 4xxx 5yyy 6 7select distinct t.class as cls from test as t 8where t.name not in ('a','b') 9 10xxx 11yyy 12zzz 13www 14

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

やり方はいろいろありますが、この要件であればGROUP BYを利用することが多いかと思います。

SQL

1SELECT t.class AS cls 2FROM test AS t 3GROUP BY t.class 4HAVING SUM(CASE WHEN t.name IN ('a', 'b') THEN 1 ELSE 0 END) = 0;

あるいはNOT EXISTSを利用することもできます。

SQL

1SELECT DISTINCT t.class AS cls 2FROM test AS t 3WHERE NOT EXISTS ( 4 SELECT * 5 FROM test AS s 6 WHERE s.class = t.class 7 AND s.name IN ('a', 'b') 8);

投稿2021/02/24 15:25

neko_the_shadow

総合スコア2349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuujiMotoki

2021/02/25 05:54 編集

ありがとうございます。 一点追加でお聞きしたいのですが、これらのカウントを列で出す場合に、1)と2)のクエリを併記することは、できるものでしょうか? 1)のみの場合は、下記のようにwhere条件で指定できます。 ```SQL select count(distinct t.class) as cls from test as t where t.name in ('a','b') ``` 2)のcountをselectで併記した場合、whereが全体的にかかってしまいます。 単純にunionでつないだとすれば、1)のカウントと2)のカウントが2行で並ぶと思いますが これを横2列にしたいのですが
neko_the_shadow

2021/02/25 07:23

「AとBのどちらかを含むclass」の数と「AとBのどちらも含まないclass」の数を横持ちしたいということでしょうか? であれば以下のようなSQLになるかと思います --- SELECT SUM(CASE WHEN cnt > 0 THEN 1 ELSE 0 END) AS "AとBのどちらかを含む", SUM(CASE WHEN cnt = 0 THEN 1 ELSE 0 END) AS "AとB両方を含まない" FROM ( SELECT SUM(CASE WHEN name IN ('a', 'b') THEN 1 ELSE 0 END) AS cnt FROM test GROUP BY class ) AS s
yuujiMotoki

2021/02/25 08:56

恐れ入りました。SUMという関数を重ねて使うのですね。このクエリには、DISTINCTもCOUNTもWHEREも使わないので、いままでとは全く別次元でした。もう少し勉強したいと思います。
guest

0

2)の答えとしては、1)と反対の集合になります。

とのことなので、その通りに組みます。

SQL

1select distinct t.class as cls from test as t 2where t.class NOT in ( 3 select distinct tc.class as cls from test as tc 4 where tc.name in ('a','b') 5)

投稿2021/02/24 13:36

YT0014

総合スコア1748

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

2)NAMEにa、bどちらも含まないCLASS

CLASS NAME xxx c xxx d

WHEREの条件にc, d を含まないと書いていないからSELECT対象になっているだけでは?条件を見直しては?

投稿2021/02/24 13:12

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問