mysql 不同两张表求总和

有两张表,分别是大一、大二成绩表:[grade1],[grade2]。两张表除了表名不同,字段完全一致。字段:id,[学生id]student-id,[分数]score※... 有两张表,分别是大一、大二成绩表:[grade1] ,[grade2]。
两张表除了表名不同,字段完全一致。
字段:id,[学生id]student-id,[分数]score

※加个条件,如果grade1比grade2多一条数据,或者grade2比grade1多5条学生数据,就要以并集的方式求结果。
grade1
id student-id score
1 15001 9
2 15002 7.5
3 15003 8
4 15004 8.2
5 15005 7
--------------------
grade2
id student-id score
1 15001 9
2 15002 7.5
3 15003 8
4 15005 7
5 15006 8.2

我需要求出这些学生大一,大二的学分[score]总和(并集方式),并且进行排序。
这个并集刚接触还不太理解,求个思路,蟹蟹大佬们
展开
 我来答
longrenyingdc8ecb1
2019-08-29 · TA获得超过1万个赞
知道大有可为答主
回答量:6032
采纳率:82%
帮助的人:2487万
展开全部
有三个办法(我的连接直接写的都是id,如果不用这个连接那么就自己换掉)
(1)union all(两张表直接union all),这个不会和union一样去掉重复的(万一有一个id一样,的学生,成绩也一样,那不是直接少算一科,当然如果你的id是科目id,大一大二不会重复,那就当我没说),而是直接全部排列出来,然后两张表变成一张表,直接sum就行了。
你说的并集,举例就是大二有人转系,有人走,有人来,那么有人有大一成绩但是没有大二成绩,有人有大二成绩没有大一成绩,可是这两者都要显示出来,是这个意思吧。
只是union all以后,外面要套一层select * from,不然如果把这个放在子查询那么就会报错,毕竟这是两张表,不是一张。
(2)计算两遍一个左连接,一个右连接,得到的结果union(不是union all啊),这样去掉重复的就OK了,别忘了没有空集补0,我的isnull写的应该不规范,而且需要测试测试,毕竟也有不需要写的可能。

举例,select a.id,a.student_id,a.score+isnull(b.score,0) aa from a left join b on a.id=b.id
union
select b.id,b.student_id,isnull(a.score,0)+b.score aa from a right join b on a.id=b.id
(3)办法差不多,不过这个是先求出只有大一成绩的,再求出只有大二成绩的,然后再求出两个成绩都有的。
select a.id,a.student_id,a.score from a where a.id not in (select id from b)
union
select b.id,b.student_id,b.score from b where b.id not in (select id from a)
union
select a.id,a.student_id a.score+b.score score from a,b where a.id=b.id
至于full join的写法,mysql我忘了有没有了,如果有更好,没有的话,那么就不那么好办了。
卡洛琳1016
2019-08-29 · TA获得超过228个赞
知道小有建树答主
回答量:208
采纳率:78%
帮助的人:57万
展开全部

这个使用union all就可以了。

答案如下:

select  student-id, sum(score)  allscore

from (select student-id,score from grade1 

 union all 

select student-id,score from grade2)  t 

group by student-id 

order by allscore desc ;


以上就是具体答案,附上union all的相关知识点链接:网页链接

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
无夜云1q
2019-08-27 · 超过24用户采纳过TA的回答
知道答主
回答量:31
采纳率:100%
帮助的人:8.3万
展开全部
我写的Oracle语法,你看看和MySQL有什么出入的地方改一改就可以了,应该差不多,我不知道你的A表的id和B表的id是否关联,如果不关联一个SQL语句实现不了,会出现冗余的笛卡尔积,
---A表和B表ID关联
create or replace view view_name
as
select t1.id,
sum(t1.xx) x,
sum(t2.yy) y,
sum(t1.xx+t2.yy) z
from A t1,
B t2
where t1.id = t2.id
group by t1.id
追问
秒答,你真的看问题了吗 ,感觉你说的文不对题
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jyvngshjj
2019-08-28 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:101
采纳率:33%
帮助的人:20.1万
展开全部
  1. 在实际开发的角度来讲,这个就是一张表,不会设计两张表的.

  2. 不考虑其他,完全按照题目来做:

SELECT student_id, SUM(score) SSM FROM (

  SELECT id_, student_id, score FROM grade1

  UNION 

  SELECT id_, student_id, score FROM grade2

GROUP BY student_id  

ORDER BY student_id  DESC,SSM ASC

追问
不太行啊大佬,因为我这个是要求并集的。比如说大一有学生A、B、C,大二:B、C、D。结果就必须是A、B、C、D四个学生的都有,按你这个做的时候,会报[Every derived table must have its own alias],而且如果加了别名,在嵌套最外层的select语句的时候指定了sum的是表1或者表2,就没办法求出相关这个student-id的总和了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
vee646
2019-08-28 · 超过20用户采纳过TA的回答
知道答主
回答量:41
采纳率:66%
帮助的人:14万
展开全部
select t1.student-id,
t2.student-id,
t1.score as score1,
t2.score as score2,
(t1.score as score1+t2.score as score2)as sum
from Grade1 t1
FULL OUTER JOIN Grade2 t2
ON t1.student-id=t2.student-id
order by sum desc
建议给表加一个年级字段
追问
会报这个错:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN  Grade2 ' 。
之前我也想过用FULL OUTER JOIN,但貌似不能用
追答

刚才那个没有试,现在我在自己数据库里建了表,查询结果应该符合你的要求。

代码:

select 

(case 

when t1.student_id is not null then t1.student_id 

when t1.student_id is null then t2.student_id

end)

 as stuid,

t1.score as score1,

t2.score as score2,

( isnull(t1.score,0)+isnull(t2.score,0))as sum

from Grade1 t1

FULL OUTER JOIN Grade2 t2

ON t1.student_id=t2.student_id

order by sum desc

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式