英文:
SQL | Select rows as columns
问题
我有一个如下的表结构:
学生ID | 科目 | 成绩 |
---|---|---|
1 | 数学 | 10 |
1 | 物理 | 30 |
2 | 数学 | 25 |
我想以以下格式选择数值:
学生ID | 数学 | 物理 |
---|---|---|
1 | 10 | 30 |
2 | 25 |
请问如何在SQL中完成这个任务?我正在使用PostgreSQL。
或者我是否需要在Java中完成,因为那是我们的中间件?
谢谢。
英文:
I have a table schema as below:
Student ID | Subject | Marks |
---|---|---|
1 | Maths | 10 |
1 | Physics | 30 |
2 | Maths | 25 |
I want to select the values in below format:
Student ID | Maths | Physics |
---|---|---|
1 | 10 | 30 |
2 | 25 |
Could you please suggest how this can be accomplished in SQL? I'm using Postgresql.
Or I'll have to do it in Java as that is our middleware?
Thank you.
答案1
得分: 1
你可以使用属于 tablefunc
模块的 crosstab
函数。
首先,下载该模块。
之后,你可以使用以下查询(必要的插入可以在这里找到):
SELECT *
FROM crosstab(
'select student_id, subject, mark::text
from student_marks
order by student_id ASC, mark ASC'
) AS ct(entity_id integer, "Math" text, "Physics" text);
在这里,crosstab
接收一个参数,即 SQL 查询作为文本,并将查询的结果转置为这些列:entity_id
、Math
和 Physics
。
你可以在这里了解更多关于 crosstab
的信息:one、two。
英文:
You can use crosstab
function which belongs to the tablefunc
module.
First, download the module.
After you can use this query (necessary inserts can be found here):
SELECT *
FROM crosstab(
'select student_id, subject, mark::text
from student_marks
order by student_id ASC, mark ASC'
) AS ct(entity_id integer, "Math" text, "Physics" text);
Here crosstab
receives 1 argument, a SQL query as a text, and transposes the query's result into these columns: entity_id
, Math
and Physics
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论