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

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

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

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

Q&A

0回答

423閲覧

データの組み合わせ数を集計したい

dsisn

総合スコア0

SQL

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

0グッド

1クリップ

投稿2020/04/26 10:37

前提

A君:リンゴ、ミカン、モモ
B君:ミカン、モモ
C君:リンゴ、ミカン、ナシ
という持ち物データがあります。

それを、
持ち物テーブル

名前持ち物
A君リンゴ
A君ミカン
A君モモ
B君ミカン
B君モモ
C君リンゴ
C君ミカン
C君ナシ

果物マスタ

id果物
0リンゴ
1ミカン
2モモ
3ナシ

という形式で持っています。

やりたいこと

↓のような、組み合わせの数を集計したい。
例:「リンゴとミカン」の組み合わせを持っている人数は2人

リンゴミカンモモナシ
リンゴ×211
ミカン××21
モモ×××0
ナシ××××

どちらかと言えばこうすべきか?

組合せ1組合せ2COUNT
リンゴミカン2
リンゴモモ1
リンゴナシ1
ミカンモモ2
ミカンナシ1
モモナシ0

試したこと

SQL

1SELECT 2 'リンゴ' AS '組合せ1' 3, 持ち物 AS '組合せ2' 4, COUNT(持ち物) 5FROM 6 持ち物テーブル 7WHERE 8 名前 = (SELECT DISTINCT 名前 9 FROM 持ち物テーブル 10 WHERE 持ち物 = 'リンゴ') AS 'リンゴ持ってる人リスト' 11GROUP BY 持ち物

とすると、

組合せ1組合せ2COUNT
リンゴミカン2
リンゴモモ1
リンゴナシ1

は得られますが、これをマスタの中身の数だけ取得したい(実際のマスタの中身は100以上のため手ではやりたくない)
外部のプログラムでマスタ取得

上記コードの「リンゴ」の部分を書き換えながらforループしつつ実行
でも実現できると思いますが、もしSQLだけで一発でできる書き方があれば知りたいと思って質問しました。

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

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

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

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

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

gentaro

2020/04/27 04:01

「やりたいこと」の最初に書かれている例だと、マスタが100件あれば100x100 の表が得られ、しかもそのうち半分以上は無駄になりますが、それでいいんですか? 明らかに2番目の案の方がマシだとは思いますが。 あと、SQLは方言があるので、想定しているDBMSの種類は書いてください。 その際にCREATE TABLE文とデータのINSERT文も書いておけば、回答者が得やすくなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問