查询以行值作为列 header 连接三个表

Query for Joining three tables with row value as column header

我有三个 table,如下所示。

TABLE1 : tb_subject
subject_id  subject_name
  1          English
  2          Maths
  3          Science

Table2 : tb_student
subject_id  student_id 
    1         AA        
    1         BB
    2         CC
    3         DD
    3         EE

  Table3 : tb_student_score
   student_id  score  conducted_month_number
      AA         20          2
      BB         30          3
      CC         50          4
      AA         80          4
      DD         50          6
      BB         10          2
      EE         40          3

结果应该是

  conducted_month_number SUM(subject_id1)  SUM(subject_id2)  SUM(subject_id3) 
         1                   0                  0                   0
         2                  30                  0                   0
         3                  30                  0                  40
         4                  80                 50                   0
         5                   0                  0                   0
         6                   0                  0                  60
         7                   0                  0                   0
         8                   0                  0                   0
         9                   0                  0                   0
         10                  0                  0                   0
         11                  0                  0                   0
         12                  0                  0                   0

如何为此编写 select 查询?可以像在结果输出中一样添加未存储在 table 中的所有月份编号吗?

您应该能够使用 case when 对每个主题单独求和:

SELECT conducted_month_number,
       SUM(CASE b.subject_id WHEN 1 THEN a.score ELSE 0 END) AS English,
       SUM(CASE b.subject_id WHEN 2 THEN a.score ELSE 0 END) AS Maths,
       SUM(CASE b.subject_id WHEN 3 THEN a.score ELSE 0 END) AS Science
FROM tb_student_score AS a
  JOIN tb_student AS b ON b.student_id = a.student_id
GROUP BY conducted_month_number
ORDER BY conducted_month_number;

但是,仅此一项并不能确保您获得不存在的 conducted_month_number 值的结果 - 如果这是一个问题,您可以简单地创建一个每个月分数为 0 的虚拟学生.

编辑:我注意到在我提交答案的同时发布了一些评论 - 如果您希望求和列的数量根据 tb_subject table 中的行值而变化,您不会发现 SQL 的关系模型非常适合该任务。但是,您可以轻松地返回并更新您的查询以包括您以后可能添加的任何新主题。

使用 union statement 添加了 1 到 12 个月的 dummy values,后来对它们进行了 group by 计算总分。

试试这个:-

Select conducted_month_number ,
sum(case when subject_id=1 then score else 0 end) as sum_subject_id1,
sum(case when subject_id=2 then score else 0 end) as sum_subject_id2,
sum(case when subject_id=3 then score else 0 end) as sum_subject_id3
from
(
Select a.conducted_month_number ,subject_id,score
from
tb_student_score a
inner join 
tb_student b
on a.student_id=b.student_id
union 
select 1,' ',0 from tb_student_score
union 
select 2,' ',0 from tb_student_score
union 
select 3,' ',0 from tb_student_score
union 
select 4,' ',0 from tb_student_score
union 
select 5,' ',0 from tb_student_score
union 
select 6,' ',0 from tb_student_score
union 
select 7,' ',0  from tb_student_score
union 
select 8,' ',0 from tb_student_score
union 
select 9,' ',0  from tb_student_score
union 
select 10,' ',0  from tb_student_score
union 
select 11,' ',0  from tb_student_score
union 
select 12,' ',0 from tb_student_score
)a
group by conducted_month_number

My Output

conducted_month_number  sum_subject_id1 sum_subject_id2 sum_subject_id3
               1              0               0             0
               2              30              0             0
               3              30              0             40
               4              80              50            0
               5              0               0             0
               6              0               0             50
               7              0               0             0
               8              0               0             0
               9              0               0             0
              10              0               0             0   
              11              0               0             0   
              12              0               0             0