2017-09-25 8 views
0

私はこれを学生の名前をあまり繰り返さないようにしようとしています。私はSQLクエリにはかなり新しいです。各学生のために1行にすべてのリストを表示することで、これを行うより良い方法があるかどうかは不思議です。各名前のすべての値を列挙してSQLグループを作成

SELECT s.name students, c.name classes 
FROM students s INNER JOIN enrollments e ON s.id=e.student_id 
INNER JOIN classes c ON e.class_id=c.id 
GROUP BY s.name, c.name; 

は私にクリーンな方法があるかどう興味があるだけ

students | classes 
-----------+---------------- 
Paige  | Calculus 
Pajak  | Calculus 
Pajak  | Yoga 
Pamela | Calculus 
Pamela | Cooking Pasta 
Pamela | Football 
Pamela | Singing 
Pamela | Yoga 
Parker | English 
Parker | Fruit 
Parker | Social Studies 

を与えます。

+1

SELECT s.name students, string_agg(c.name, '|') classes FROM students s INNER JOIN enrollments e ON s.id=e.student_id INNER JOIN classes c ON e.class_id=c.id GROUP BY s.name; 

結果は、一般的には、集計関数(SUM、AVG、COUNTなど)なしでGROUP BYを使用することはありません。あなたがPIVOT機能を取得しようとしているような音ですか?あなたが「各学生のために1つの列に記載されている」ことによって他に何を意味するかわからない。各生徒に複数のクラス値があります。したがって、1人の学生につき複数の行。 –

+0

私はそれが私の質問に答えると思います。あなたが言っていることから、正しく理解すれば、各生徒は複数のクラスを持っているので、生徒ごとに複数の行があることになります。私は各学生のためにすべてのクラスを1つの行に入れようとしていましたが、それはあまりにも単純です。ありがとう:D。 –

+1

これは、多くの関数を使用していますが、基本SELECTだけではありません。私はPosgreSQLを使用すると[STRING_AGG](https://www.postgresql.org/docs/9.0/static/functions-aggregate.html) –

答えて

1

大変感謝しています。 @Jacob Hstring_aggの彼の提案は魅力的に働いた。で...

students |     classes 
-----------+---------------------------------------------- 
Piper  | Social Studies|Fruit 
Paige  | Calculus 
Pedro  | Programming 
Peter  | Yoga|Gym 
Peggy  | Fruit 
Patricia | Social Studies 
Paula  | Fruit|Football 
Phoebe | English|Gym|Cooking Pasta 
Pamela | Cooking Pasta|Yoga|Football|Calculus|Singing 
Parker | Social Studies|English|Fruit 
Priscilla | How to Guitar|Gym 
Priyal | Programming 
Patrick | Cooking Pasta|Singing|How to Guitar 
Puja  | Singing|Programming|English|Social Studies 
Paxton | Gym 
Pepe  | Yoga 
Penelope | Cooking Pasta 
Pajak  | Yoga|Calculus 
Parth  | How to Guitar 
3

おそらく、あなたはlistagg()をしたい:

SELECT s.name as students, listagg(c.name) within group(order by c.name) as classes 
FROM students s INNER JOIN 
    enrollments e 
    ON s.id = e.student_id INNER JOIN 
    classes c 
    ON e.class_id = c.id 
GROUP BY s.name, c.name; 

これは、それぞれの生徒がいるクラスのカンマ区切りのリストを作成します

EDIT:。

のPostgresでは、あなたはstring_agg()を使用することができます

SELECT s.name as students, string_agg(c.name order by c.name) as classes 
FROM students s INNER JOIN 
    enrollments e 
    ON s.id = e.student_id INNER JOIN 
    classes c 
    ON e.class_id = c.id 
GROUP BY s.name, c.name; 
+0

DB2の構文に似ています。これはPostgresql –

+0

@ClodoaldoNetoというタグが付けられています。 。 。実際は、Oracle。私は元の質問はplsqlというタグが付いていると思ったが、タグは実際にはpsqlだった。 –

関連する問題