需求:有一张学生的成绩表,这张表有如下的字段:id,name,score,求查询结果是:id,name,score,以及该学生的所有科目的总和
数据准备如下:
首先创建表:
create table stu_score(
name varchar(20),
subject varchar(20),
score int(8)
)engine=innodb default charset=utf8;
创建好表之后,插入数据:
insert into stu_score values ('张三','语文',80);
insert into stu_score values ('张三','英语',60);
insert into stu_score values ('张三','数学',70);
insert into stu_score values ('李四','数学',66);
insert into stu_score values ('李四','语文',86);
insert into stu_score values ('李四','英语',68);
查看数据:
select * from stu_score;
接着,我一开始的想法是group by name,然后再将每个字段添加到select的后面,最后再用sum(score) over()开窗。如下所示:
很明显,当用到group by的时候,一定要想到,我group by几个字段的话,select后面要接上几个字段。这从一开始就是错的。
想过用另一种方式来做:
对每个字段都进行group by,这样都能被select选上,最后再用sum()开窗。
很显然,这里用开窗是不太行的。
所以采用最简单的方法,采用子查询:
首先查询出最后一个字段的值:
select
name,
sum(score) total_score
from stu_score
group by name;
这张表作为t1,再和原来的表作关联。
这是最终的sql:
select
st.name,
subject,
score,
t1.total_score
from stu_score st
join (select
name,
sum(score) total_score
from stu_score
group by name)t1
on st.name=t1.name;
就能得出最后的结果: