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

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

ただいまの
回答率

90.50%

  • SQL

    2392questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 247

k0908

score 82

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です

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2018/07/06 14:07

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • mts10806

    2018/07/06 14:07

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

    キャンセル

回答 5

checkベストアンサー

+1

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

select t1.name, t2.name, t1.score, t2.score
from user t1 inner join user t2
     on t1.name < t2.name
order by t1.name, t2.name


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/06 14:23

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

    キャンセル

  • 2018/07/06 14:47 編集

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

    キャンセル

0

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

create table tbl (id int primary key,val varchar(10),score int);
insert into tbl values
(1,'a',30),
(2,'b',50),
(3,'c',40),
(4,'d',70),
(5,'e',60);

select * from tbl as t1
inner join tbl as t2 on t1.id<t2.id

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/06 17:45

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

    キャンセル

0

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

SELECT DISTINCT
       CASE WHEN main.Name < sub.Name THEN main.Name ELSE sub.Name END AS Name1
     , CASE WHEN main.Name < sub.Name THEN sub.Name ELSE main.Name END AS Name2
     , CASE WHEN main.Name < sub.Name THEN main.Score ELSE sub.Score END AS Score1
     , CASE WHEN main.Name < sub.Name THEN sub.Score ELSE main.Score END AS Score2
  FROM User AS main
INNER JOIN User AS sub ON main.Name <> sub.Name

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2392questions

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