简体   繁体   English

如何使用 SQL sum function 在具有相应主键的不同 MySQL 表中添加值?

[英]How do I use the SQL sum function to add values in different MySQL tables with the corresponding Primary Key?

I had five different tables created in MySQL containing student records.我在 MySQL 中创建了五个不同的表,其中包含学生记录。 Each table basically have uniform column names.每个表基本上都有统一的列名。 A StudentID , Subject1_Score , Subject2_Score , Subject3_Score , Total_Score .一个StudentIDSubject1_ScoreSubject2_ScoreSubject3_ScoreTotal_Score The five tables are Term1 , Term2 , Term3 , Term4 and overall .这五个表分别是Term1Term2Term3Term4整体

What i want to do is when I insert values into Term1 , Term2 , Term3 and Term4 , the sum of the scores in each column, Subject1_Score , Subject2_Score , Subject3_Score , Total_Score must be automatically calculated and placed in the corresponding columns in overall table.我想要做的是当我将值插入Term1Term2Term3Term4时,必须自动计算每列中的分数总和Subject1_ScoreSubject2_ScoreSubject3_ScoreTotal_Score并放置在表的相应列中。 Below is the code i have.下面是我的代码。 I am trying to update overall table when i insert scores into Term1 table.当我将分数插入Term1表时,我正在尝试更新整个表。 What it is doing at the moment is getting the total sum of the Total_Score column.它目前正在做的是获取Total_Score列的总和。 I want it to take the value of Total_Score in Term1 and add it to the value of Total_Score in overall and then place it inside overall as the updated current value.我希望它获取Term1Total_Score的值并将其添加到Total_Score总体值中,然后将其作为更新的当前值放在总体中。 Below is my code.下面是我的代码。 Please help me achieve what I want to do.请帮助我实现我想做的事情。

SELECT SUM( Total_Score ) 
FROM (


SELECT SUM( Total_Score ) AS Total_Score
FROM Term1
UNION ALL 
SELECT SUM( Total_Score ) AS Total_Score
FROM overall
) AS ALIAS;

Your current design is not normalised and means a lot of effort is required to achieve what you want.您当前的设计没有标准化,这意味着需要付出很多努力才能实现您想要的。

For EVERY term table create before and after insert trigger,before and after update triggers and an after delete trigger wherein you parse all the tables to calculate the overall.total.对于每个术语表,在插入触发器之前和之后创建、更新触发器之前和之后以及删除触发器之后,您可以在其中解析所有表以计算总体总数。 Something like this (I have only created insert and update triggers for term1 to cut down on the answer size)像这样的东西(我只为 term1 创建了插入和更新触发器以减少答案大小)

drop trigger if exists trigger_after_term1_insert;
drop trigger if exists trigger_before_term1_insert;
drop trigger if exists trigger_after_term1_update;
drop trigger if exists trigger_before_term1_update;

delimiter $$
create trigger trigger_term1_before_insert before insert on term1
for each row
begin
  insert into debug_table(msg) values (concat('before insert:',new.subject1_score + new.subject2_score + new.subject3_score));
  set new.total = new.subject1_score + new.subject2_score + new.subject3_score; #you may need coalesce here
end $$

delimiter $$
create trigger trigger_term1_before_update before update on term1
for each row
begin
  insert into debug_table(msg) values (concat('before update:',new.subject1_score + new.subject2_score + new.subject3_score));
  set new.total = new.subject1_score + new.subject2_score + new.subject3_score; #you may need coalesce here
end $$

delimiter $$
create trigger trigger_term1_after_insert after insert on term1
for each row
begin
 insert into debug_table(msg) values ('after insert');
 if not exists (select 1 from overall o where o.studentid = new.studentid) then
         insert into debug_table(msg) values ('after insert Not exists');
        insert into overall(studentid,total)
                select studentid,sum(tot) 
                 from
                 (
                 select new.studentid,new.subject1_score + new.subject2_score + new.subject3_score tot
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term2 #amend as required
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term3 #amend as required
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term4 #amend as required
                 ) b
                 group by studentid;
       end if;
end $$

delimiter $$
create trigger trigger_term1_after_update after update on term1
for each row
begin
 insert into debug_table(msg) values ('after update');
 if exists (select 1 from overall o where o.studentid = new.studentid) then
    insert into debug_table(msg) values ('after update exists');
    update overall 
           join (select studentid,sum(tot) tot
                 from
                 (
                 select new.studentid,new.subject1_score + new.subject2_score + new.subject3_score tot
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term2 #amend as required
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term3 #amend as required
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term4 #amend as required
                 ) a
                 group by studentid
                 ) s
                 on s.studentid = overall.studentid
         set overall.total = s.tot;
      else
         insert into debug_table(msg) values ('after update Not exists');
        insert into overall(studentid,total)
                select studentid,sum(tot) 
                 from
                 (
                 select new.studentid,new.subject1_score + new.subject2_score + new.subject3_score tot
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term2 #amend as required
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term3 #amend as required
                 union all
                 select studentid,subject1_score + subject2_score + subject3_score from term4 #amend as required
                 ) b
                 group by studentid;
       end if;
        
 
end $$
delimiter ;

Note 1) debug_table is there to assist debugging 2) studentid is primary key on all tables注意 1) debug_table 可以帮助调试 2) studentid 是所有表的主键

You could dispense with the before triggers if your version of mysql supports generated columns BUT you really should not store data which can be easily calculated.如果您的 mysql 版本支持生成的列,您可以省去之前的触发器,但您确实不应该存储可以轻松计算的数据。

IF your db was normalised then all this code disappears.如果您的数据库被规范化,那么所有这些代码都会消失。 Consider a table studentid,term,subject,subject_score考虑一个表 studentid,term,subject,subject_score

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM