質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

4回答

14534閲覧

グループの中から条件に当てはまるグループを抽出するSQL

nitakaho

総合スコア14

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

1グッド

1クリップ

投稿2017/05/11 23:54

###グループの中から条件に当てはまるグループを抽出したい
グループの中から条件に当てはまるグループを抽出したいです。

例えば、下記のようなテーブル(テーブル名test)を例とします。

idgroup_iditem
11A
21B
31C
42B
52C
63A
73B
83C
93D

この中から、「item 'A' を含まない」かつ「item 'B'を含む」グループ(group_id)を抽出する、という感じです。
この場合、group_id=2 を抽出したいです。
これを実現するSQL(できればPostgreSQLで実行可能なもの)を教えて頂きたいです。

アドバイスおねがいいたします。

AketiJyuuzou👍を押しています

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

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

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

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

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

guest

回答4

0

SQLFiddleのPostgreSQL9.3環境で作ってみました :-)

sql

1with t(id,group_id,item) as 2(values(1,1,'A'), 3 (2,1,'B'), 4 (3,1,'C'), 5 (4,2,'B'), 6 (5,2,'C'), 7 (6,3,'A'), 8 (7,3,'B'), 9 (8,3,'C'), 10 (9,3,'D')) 11select group_id 12 from t 13group by group_id 14having bool_or(item = 'A') = false 15 and bool_or(item = 'B'); 16 17| group_id | 18|----------| 19| 2 | 20

投稿2017/05/13 04:23

AketiJyuuzou

総合スコア1147

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

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

nitakaho

2017/05/13 05:26

ご回答ありがとうございます! bool_or()という関数は知りませんでした。 こちらもシンプルでわかりやすいですね。
guest

0

ベストアンサー

inで選別しています。

sql

1select * from test 2where group_id not in (select distinct group_id from test where item='A') 3and group_id in (select distinct group_id from test where item='B');

投稿2017/05/12 00:37

A.Ichi

総合スコア4070

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

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

nitakaho

2017/05/12 02:06

ご回答ありがとうございます。 このSQLで実行できました! 別の方の回答でのSQL select group_id from test group by group_id having sum(case when item='A' then 1 else 0 end)=0 and sum(case when item='B' then 1 else 0 end)>0 でも実行できました! いずれとも、シンプルでわかりやすいです。 ありがとうございました!
guest

0

実行していないので間違ってたらすみません。

SQL

1SELECT 2 * 3FROM 4 test B 5WHERE 6 item = 'B' AND 7 NOT EXISTS 8 ( 9 SELECT 10 * 11 FROM 12 test A 13 WHERE 14 A.item = 'A' AND 15 A.group_id = B.group_id 16 )

投稿2017/05/12 00:52

workaholist

総合スコア559

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

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

nitakaho

2017/05/12 02:08

こちらのSQLで実行できました! ありがとうございます!!
guest

0

postgreで動くかどうかちょっと怪しいですが単純に

SQL

1select group_id 2from test 3group by group_id 4having sum(item='A')=0 and sum(item='B')>0 5

投稿2017/05/12 01:17

yambejp

総合スコア114814

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

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

A.Ichi

2017/05/12 01:29

caseを入れると行けるのでは? select group_id from test group by group_id having sum(case when item='A' then 1 else 0 end)=0 and sum(case when item='B' then 1 else 0 end)>0
yambejp

2017/05/12 01:33

A.Ichiさんありがとうございます postgreはやはり数値化しないとsumとれないんですね (わたしのはMySQL的な書き方でした)
nitakaho

2017/05/12 02:09

ご回答ありがとうございます。 残念ながら、PostgreSQLではエラーになってしまいました。。 A.IchiさんのSQLでは実行できました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問