SQL (MariaDB) 连接 3 个表并进行数据透视
SQL (MariaDB) join 3 tables and pivot
我有 3 个 MySQL (MariaDB) tables:
学生:
student_id
name
result_id
1
Badui
31
2
Tama
32
3
Rombeng
33
主题:
subject_id
points
result_id
1
90
31
2
90
31
3
90
31
1
84
32
2
85
32
3
86
32
1
87
33
2
89
33
3
88
33
Average_Score:
AS_id
average_score
result_id
1
90
31
2
85
32
3
88
33
想要Table:
name
1
2
3
average_score
Badui
90
90
90
90
Rombeng
87
89
88
88
Tama
84
85
86
85
我需要使用联接和数据透视来获得此视图,但我不知道如何将联接和数据透视完全结合起来。这是我的 sql 的 JOIN
SELECT
name, subject_id, points, average_score
FROM
Students as stud
JOIN
Average_Score as avr
ON
stud.result_id = avr.result_id
JOIN
Subject as subj
ON
avr.result_id = subj.result_id
ORDER BY name
这是 JOIN sql
的结果
name
subject_id
points
average_score
Badui
1
90
90
Badui
2
90
90
Badui
3
90
90
Rombeng
1
87
88
Rombeng
2
89
88
Rombeng
3
88
88
Tama
1
84
85
Tama
2
85
85
Tama
3
86
85
是否有任何有效的方法来修改我的 sql 以匹配枢轴 table 以获得所需的视图?
我需要一些帮助才能得到正确的查询。
谢谢。
您可以尝试使用以下查询:
SELECT stud.name,
MAX(IF(subj.subject_id=1, subj.points, NULL)) AS `1`,
MAX(IF(subj.subject_id=2, subj.points, NULL)) AS `2`,
MAX(IF(subj.subject_id=3, subj.points, NULL)) AS `3`,
ROUND(AVG(subj.points)) AS `average_score`
FROM Students stud
INNER JOIN Subject subj
ON stud.result_id = subj.result_id
GROUP BY stud.name
这个解决方案背后的想法是加入 tables Students 和 Subject 在 result_id
字段,然后为每个 points
获取对应于相关 subject_id
的列,并使用 MAX 函数聚合以删除 NULL 值。最终,不用加入 Average_Points table,您可以直接根据 Subject[=25 中的数据进行计算=] table.
试试看 here.
我有 3 个 MySQL (MariaDB) tables:
学生:
student_id | name | result_id |
---|---|---|
1 | Badui | 31 |
2 | Tama | 32 |
3 | Rombeng | 33 |
主题:
subject_id | points | result_id |
---|---|---|
1 | 90 | 31 |
2 | 90 | 31 |
3 | 90 | 31 |
1 | 84 | 32 |
2 | 85 | 32 |
3 | 86 | 32 |
1 | 87 | 33 |
2 | 89 | 33 |
3 | 88 | 33 |
Average_Score:
AS_id | average_score | result_id |
---|---|---|
1 | 90 | 31 |
2 | 85 | 32 |
3 | 88 | 33 |
想要Table:
name | 1 | 2 | 3 | average_score |
---|---|---|---|---|
Badui | 90 | 90 | 90 | 90 |
Rombeng | 87 | 89 | 88 | 88 |
Tama | 84 | 85 | 86 | 85 |
我需要使用联接和数据透视来获得此视图,但我不知道如何将联接和数据透视完全结合起来。这是我的 sql 的 JOIN
SELECT
name, subject_id, points, average_score
FROM
Students as stud
JOIN
Average_Score as avr
ON
stud.result_id = avr.result_id
JOIN
Subject as subj
ON
avr.result_id = subj.result_id
ORDER BY name
这是 JOIN sql
的结果name | subject_id | points | average_score |
---|---|---|---|
Badui | 1 | 90 | 90 |
Badui | 2 | 90 | 90 |
Badui | 3 | 90 | 90 |
Rombeng | 1 | 87 | 88 |
Rombeng | 2 | 89 | 88 |
Rombeng | 3 | 88 | 88 |
Tama | 1 | 84 | 85 |
Tama | 2 | 85 | 85 |
Tama | 3 | 86 | 85 |
是否有任何有效的方法来修改我的 sql 以匹配枢轴 table 以获得所需的视图?
我需要一些帮助才能得到正确的查询。 谢谢。
您可以尝试使用以下查询:
SELECT stud.name,
MAX(IF(subj.subject_id=1, subj.points, NULL)) AS `1`,
MAX(IF(subj.subject_id=2, subj.points, NULL)) AS `2`,
MAX(IF(subj.subject_id=3, subj.points, NULL)) AS `3`,
ROUND(AVG(subj.points)) AS `average_score`
FROM Students stud
INNER JOIN Subject subj
ON stud.result_id = subj.result_id
GROUP BY stud.name
这个解决方案背后的想法是加入 tables Students 和 Subject 在 result_id
字段,然后为每个 points
获取对应于相关 subject_id
的列,并使用 MAX 函数聚合以删除 NULL 值。最终,不用加入 Average_Points table,您可以直接根据 Subject[=25 中的数据进行计算=] table.
试试看 here.