SQL(MariaDB)连接3个表和透视表

aurhwmvo  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(121)

我有3个MySQL(MariaDB)表:
学生:
| 学生标识|姓名|结果标识|
| - -|- -|- -|
| 一个|八堆|三十一个|
| 2个|多摩|三十二个|
| 三个|龙本|三十三个|
主题:
| 主题标识|点数|结果标识|
| - -|- -|- -|
| 一个|九十|三十一个|
| 2个|九十|三十一个|
| 三个|九十|三十一个|
| 一个|八十四人|三十二个|
| 2个|八十五个|三十二个|
| 三个|八十六人|三十二个|
| 一个|八十七人|三十三个|
| 2个|八十九|三十三个|
| 三个|八十八个|三十三个|
平均分数(_S):
| AS标识|平均分数|结果标识|
| - -|- -|- -|
| 一个|九十|三十一个|
| 2个|八十五个|三十二个|
| 三个|八十八个|三十三个|

所需表格

| 姓名|一个|2个|三个|平均分数|
| - -|- -|- -|- -|- -|
| 八堆|九十|九十|九十|九十|
| 龙本|八十七人|八十九|八十八个|八十八个|
| 多摩|八十四人|八十五个|八十六人|八十五个|
我需要通过使用连接和透视来拥有这个视图,但是我不知道如何将连接和透视结合在一起。这是我的JOIN的sql

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的结果

| 姓名|主题标识|点数|平均分数|
| - -|- -|- -|- -|
| 八堆|一个|九十|九十|
| 八堆|2个|九十|九十|
| 八堆|三个|九十|九十|
| 龙本|一个|八十七人|八十八个|
| 龙本|2个|八十九|八十八个|
| 龙本|三个|八十八个|八十八个|
| 多摩|一个|八十四人|八十五个|
| 多摩|2个|八十五个|八十五个|
| 多摩|三个|八十六人|八十五个|
有没有什么有效的方法来修改我的sql以匹配数据透视表,从而获得所需的视图?
我需要一些帮助,有正确的查询,请。谢谢。

vuktfyat

vuktfyat1#

您可以尝试使用下列查询:

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

此解决方案的思想是在result_id字段上联接表 StudentsSubject,然后为每个points获取与相关的subject_id对应的列,并使用MAX函数进行聚合以删除NULL值。最后,您可以直接从 Subject 表中的数据进行计算,而不是联接 Average_Points 表。
试试看here

相关问题