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

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

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

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

Q&A

解決済

5回答

9461閲覧

NAME を全通りの組み合わせを作りたい

k0908

総合スコア102

SQL

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

0グッド

0クリップ

投稿2018/07/06 05:02

編集2018/07/06 05:23

DBのUser テーブルに

NAME  SCORE Tom 40 Juddy 50 John 60 ・ ・ ・ Peter 30

というように10このデータが入っています。このテーブルに対してSQL文を書いて

NAME1 NAME2 SCORE1 SCORE2 Tom Juddy 40 50 Juddy John 50 60 ・ ・

という感じでNAMEに入っているデータを2つずつ全通り組み合わせてカラムを作りたいです。10C2個(45個)のカラムができるはずです。
WHERE句を使えばできそう。。。と思ってやって見ましたが

SELECT USER.NAME, USER.SCORE, FROM USER where USER.NAME

目的のテーブルが作成されませんでした。

どのようにSQLを書けば目的のものができますか?SQLはMySQLです

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

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

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

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

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

m.ts10806

2018/07/06 05:07

未完成のもので結構ですので、実際に作って実行してみたSQL文をご提示ください。
guest

回答5

0

ベストアンサー

組合せなのですから、集合は2つ必要です。
質問の場合は一つのテーブルの中身についてですから、自己結合を行う事になります。

SQL

1select t1.name, t2.name, t1.score, t2.score 2from user t1 inner join user t2 3 on t1.name < t2.name 4order by t1.name, t2.name

以下が参考になるかと思います。
SQLで数学パズルを解く(組み合わせ論編-解答)
※該当するのは「1-4.組み合わせ(Combination without repetition)」

投稿2018/07/08 05:52

編集2020/07/24 06:38
sazi

総合スコア25138

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

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

0

交差結合(CROSS JOIN)を使えば組み合わせが作れると思います。
以下にサンプルを書いておきますが、手元で動かしていないので動く保証はないです。
同名の名前があるとうまくいかないので、yambejpさんのテーブル定義のようにプライマリキーがあるべきだとは思いますが…。

sql

1SELECT u1.name, u2.name, u1.score, u2.score 2FROM USER u1 3CROSS JOIN USER u2 4WHERE STRCMP(u1.name, u2.name) < 0

投稿2018/07/06 08:43

mather

総合スコア6753

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

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

mather

2018/07/06 08:45

ちなみに、CROSS JOINは組み合わせ数が膨大になるので、実用面ではあまり多用すべきものではないと思っています。
guest

0

INNER JOINで自分と同じ名称を省いて結合することで、異なるユーザー名称との組み合わせが作成できます。
それだけですと、同じ組み合わせが存在するため、SELECT句で条件分岐を使用してユーザー名称をソートし、最後にDISTINCTで重複を排除することで45件取得できます。

SQL

1SELECT DISTINCT 2 CASE WHEN main.Name < sub.Name THEN main.Name ELSE sub.Name END AS Name1 3 , CASE WHEN main.Name < sub.Name THEN sub.Name ELSE main.Name END AS Name2 4 , CASE WHEN main.Name < sub.Name THEN main.Score ELSE sub.Score END AS Score1 5 , CASE WHEN main.Name < sub.Name THEN sub.Score ELSE main.Score END AS Score2 6 FROM User AS main 7INNER JOIN User AS sub ON main.Name <> sub.Name

投稿2018/07/06 09:13

編集2018/07/06 09:14
Waka1983

総合スコア8

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

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

0

userテーブルをうまく作れば組み合わせはラクです

SQL

1create table tbl (id int primary key,val varchar(10),score int); 2insert into tbl values 3(1,'a',30), 4(2,'b',50), 5(3,'c',40), 6(4,'d',70), 7(5,'e',60); 8 9select * from tbl as t1 10inner join tbl as t2 on t1.id<t2.id

投稿2018/07/06 05:42

yambejp

総合スコア114572

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

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

0

SQLの結果を区切り文字を使って1つの文字列にする がヒントになるかも?

CREATE TABLE, INSERTを提示したり、同じSQLでも方言が大きいですから、どのデータベースを使うのかを質問のタグで明示した方が適切なコメントが付き易いです。 SQLの観点から Oracle Database, PostgreSQL, MySQL の特徴を整理しよう!

投稿2018/07/06 05:09

Orlofsky

総合スコア16415

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

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

k0908

2018/07/06 05:23

ありがとうございます。SQLはMySQLを使っています。もしお分かりでしたらお願いいたします。
Orlofsky

2018/07/06 05:48 編集

CREATE TABLE, INSERTが提示させていません。 MySQLはデータベースで、SQLはコンピュータ言語です。表現を修正しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問