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

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

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

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

Q&A

解決済

2回答

833閲覧

大グループの中で複数の小グループに属している人の人数を知りたい

kukku-zelda

総合スコア22

SQL

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

0グッド

0クリップ

投稿2020/06/24 11:39

編集2020/06/25 02:17

質問させていただきます。

タイトルにもある通り、
大グループの中で、複数の小グループに属している人の人数を知りたいのですが、
sqlが思いつかない状態です。
お力を貸していただけないでしょうか。

【前提条件】
・SQLは方言に依存しないものを使用する(標準SQLで出したい)
・小グループのコードは重複しない
・ID(要は人)は他の大グループに所属していることもあるが大グループ毎に別人と考える
・複数小グループに属する数が2以上であればカウント

【得たい結果】

LARGE_GROUP人数
A1
B2
C4

【テーブル内のデータ】
G_TABLE:グループテーブル

LARGE_GROUPSMALL_GROUPID
A101X000001
A102X000001
A101X000002
A102X000003
B201Y000001
B202Y000001
B201Y000002
B202Y000002
C301X000001
C302X000001
C303X000001
C301Z000001
C302Z000001
C301Z000002
C303Z000002
C304Z000003
C305Z000003

【人数の内訳】
大グループA
・X000001が101と102の小グループに属している。
大グループB
・Y000001が201と202に属している
・Y000002が201と202に属している
大グループC
・X000001が301と302と303に属している
・Z000001が301と302に属している
・Z000002が301と303に属している
・Z000003が304と305に属している

【自分で思いつき、試してみたSQL】

SQL

1SELECT 2 LARGE_GROUP, 3 COUNT(ID) AS 人数 4FROM 5 G_TABLE origin 6inner join 7( 8 SELECT 9 KAKEMOCHI.LARGE_GROUP 10 KAKEMOCHI.KAKEMOCHI_ID 11 FROM ( 12 SELECT 13 LARGE_GROUP AS KAKEMOCHI_ID_LG, 14 ID AS KAKEMOCHI_ID, 15 COUNT(SMALL_GROUP) AS JOINCOUNT 16 FROM 17 G_TABLE 18 GROUP BY 19 LARGE_GROUP, 20 ID 21 HAVING JOINCOUNT > 1 22 ) KAKEMOCHI --複数小グループに属している人の大グループとIDを出したテーブル 23ON 24 origin.LARGE_GROUP = KAKEMOCHI.LARGE_GROUP 25AND origin.ID = KAKEMOCHI.ID 26GROUP BY 27 origin.LARGE_GROUP 28

よろしくお願いします。

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

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

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

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

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

YT0014

2020/06/24 11:56

例における期待する結果表をご提示ください。 また、エラーや誤った結果になったとしても、思いつくSQLを作成して、試した結果をご提示ください。 現状では、丸投げの状態です。
kukku-zelda

2020/06/24 12:03

まずは申し訳ありません。 期待する結果表は【得たい結果】に書いたつもりでした。 >また、エラーや誤った結果になったとしても、思いつくSQLを作成して、試した結果をご提示ください。 こちら追記させていただきます。
m.ts10806

2020/06/24 12:15

「SQL」といっても方言が多いです。 想定しているDBとバージョンを追記してください。
YT0014

2020/06/24 12:25

>期待する結果表は【得たい結果】に書いたつもりでした。 きちんと記載がありました。読み間違えていました。失礼しました。
guest

回答2

0

大、中、小のグループがあるような質問文ですがどうみても大と小しかない件。

D 401 X000002 という行が仮にあったらどうするのか。コレガワカラナイ

sql

1select LARGE_GROUP, count(distinct id) 2from G_TABLE A 3where ( 4 select count(*) from G_TABLE B 5 where B.ID=A.ID 6 and B.LARGE_GROUP + ' ' + B.SMALL_GROUP <> A.LARGE_GROUP + ' ' + A.SMALL_GROUP 7 ) > 0 8group by LARGE_GROUP 9order by LARGE_GROUP

投稿2020/06/24 13:17

sousuke

総合スコア3830

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

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

sazi

2020/06/24 13:30

>・SQLは方言に依存しないものを使用する(標準SQLで出したい) どう見ても標準じゃない件
sousuke

2020/06/24 13:43

みんな自分が使っているものを標準だと思っているから…(震え) SQLServerに慣れるとAccessのクエリで「こんなこともできねえの?はぁ~つっかえ!」ってなる。
sazi

2020/06/24 14:03 編集

Dを入れると、希望の結果とは違ってしまうんですね。(ソレハダメジャナイカナ)
sousuke

2020/06/24 14:14

Dの件は仕様的にも少し悩んだんで別解としてあげました笑
kukku-zelda

2020/06/25 02:19

>大、中、小のグループがあるような質問文ですがどうみても大と小しかない件。 大変失礼いたしました。 【前提】の箇所を修正しました。 誤)・ID(要は人)は他の中グループに所属していることもあるが中グループ毎に別人と考える ↓ 正)・ID(要は人)は他の大グループに所属していることもあるが大グループ毎に別人と考える 大・小の二つのグループです。 混乱する文面で申し訳ありませんでした。
kukku-zelda

2020/06/25 02:24 編集

>D 401 X000002 という行が仮にあったらどうするのか。コレガワカラナイ この場合は対象とならないので、「抽出なし」で大丈夫でした。 ご回答ありがとうございました。
sousuke

2020/06/25 02:51

そうなると仕様が違いますね?Dのデータがある場合、X000002は複数小グループに所属しています。 ・複数小グループに属する数が2以上であればカウント✕ ・同一大グループ内で小グループに属する数が2以上であればカウント○
kukku-zelda

2020/06/25 04:02

【前提】のところなのですが、 他の大グループに所属していることもあるが大グループ毎に別人と考える なので、 後者の 同一大グループ内で小グループに属する数が2以上であればカウント○ になる認識です!
sousuke

2020/06/25 07:53

いや質問者の認識ではなくて回答者に与える情報の話です。 ・複数小グループに属する数が2以上であればカウント とあれば「D 401 X000002」という行があった場合「X000002」は どうみても『複数の小グループに属しています』よね? 『他の大グループに所属していることもあるが大グループ毎に別人と考える』のでというのは 配慮に欠ける説明だと思います。現に私はほんの少し悩み、sazi氏も勘違いしました。
sazi

2020/06/25 07:59 編集

私の勘違いは、この回答のSQLの結果についてで、質問内容の取り違えは(結果的に)無かったようです。
sousuke

2020/06/25 08:10

sazi氏はそっちの方だったんですね笑 まあいずれにしてもプログラム書いているなら、正確に伝えましょう~
guest

0

ベストアンサー

SQL

1select large_group, count(distinct id) 2from G_TABLE t 3where ( 4 select count(*) from G_TABLE 5 where large_group = t.large_group and id = t.id 6 ) > 1 7group by large_group 8order by large_group

または

SQL

1select large_group, count(distinct id) 2from G_TABLE t 3where exists( 4 select 1 from G_TABLE 5 where large_group = t.large_group and id = t.id and small_group != t.small_group 6 ) 7group by large_group 8order by large_group

投稿2020/06/24 12:48

編集2020/06/24 12:51
sazi

総合スコア25327

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

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

kukku-zelda

2020/06/24 13:00

ありがとうございます! 大変助かりました! 考え方をきちんと理解できるまで、上記SQLを読み込みます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問