SQL group by 列出每个名称的所有值

标签 sql postgresql

我正在努力避免重复学生的名字。我对 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

只是好奇是否有更简洁的方法。

最佳答案

也许你想要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;

这将创建每个学生所在类(class)的逗号分隔列表。

编辑:

在 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;

关于SQL group by 列出每个名称的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46411840/

相关文章:

python - PostgreSQL - 重复条目的列跟踪计数

sql - PL/SQL %TYPE 的 T-SQL 等价物?

mysql - SQL Select 查询收藏夹系统

mysql - SQL Group By with limit and distinct - MySQL

php - 优化SQL语句: Select multiple values

spring - 如何最好地处理 Spring JDBC 中的约束冲突

python - SQLAlchemy:限制在与where相同的字符串中

postgresql - 什么 PostgreSQL 查询或 View 可以确定谁设置了用户权限?

Postgresql psql命令转储错误

C# 获取 SQL 日志