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 StudentsSubjectresult_id字段,然后为每个 points 获取对应于相关 subject_id 的列,并使用 MAX 函数聚合以删除 NULL 值。最终,不用加入 Average_Points table,您可以直接根据 Subject[=25 中的数据进行计算=] table.

试试看 here.