同一张表两方各字段相同_【自动化/测开面试集锦系列】SQL学生表

05

前言

接着上一篇继续学生表

万年不变学生表

有2张表,学生表(student)基本信息如下

2a13b49870b6770926cf724d0288967d.png

科目和分数表(grade)

0c49418b6abc7566631a9f176bf229ab.png

计算学生平均分数

计算每个人的平均成绩, 要求显示字段: 学号,姓名,平均成绩

select a.id, a.name, c.avg_score

from student a,

(select b.id, avg(b.score) as avg_score

from grade b

group by b.id

)c

where a.id = c.id

973a5eac5c2bebe9ca12e78bdaabd824.png

统计各科目成绩

计算每个人的成绩,总分数,平均分,要求显示:学号,姓名,语文,数学,英语,总分,平均分

使用case when 语法把科目字段分解成具体的科目:语文,数学, 英语

select a.id as 学号, a.name as 姓名,

(case when b.kemu='语文' then score else 0 end) as 语文,

(case when b.kemu='数学' then score else 0 end) as 数学,

(case when b.kemu='英语' then score else 0 end) as 英语

from student a, grade b

where a.id = b.id

98d45c58c38b37d7e334cab920642761.png

SELECT a.id as 学号, a.name as 姓名,

sum(case when b.kemu='语文' then score else 0 end) as 语文,

sum(case when b.kemu='数学' then score else 0 end) as 数学,

sum(case when b.kemu='英语' then score else 0 end) as 英语,

sum(b.score) as 总分 ,

sum(b.score)/count(b.score) as 平均分

FROM student a, grade b

where a.id = b.id

GROUP BY b.id, b.id

9d0b3a37c0f140b581077ca9a92316a4.png

每门课程平均成绩

列出各门课程的平均成绩,要求显示字段:课程,平均成绩

select b.kemu, avg(b.score)

from grade b

group by b.kemu

84d5cc08261f500893b4ad002f685f88.png

成绩排名

列出数学成绩的排名, 要求显示字段:学号,姓名,成绩,排名

在查询结果表里面添加一个变量@paiming,让它自动加1

SELECT

t.id, t.score as 数学分数, @paiming := @paiming+1 as 排名

FROM

(SELECT b.id, b.score

FROM grade b

WHERE b.kemu = '数学'

ORDER BY score

DESC) AS t,

(SELECT @paiming := 0) r

082d1aea1fc88cb6c95a66cd4656510c.png

结合student表获取学生名称

SELECT

t.id, a.name,t.score as 数学分数, @paiming := @paiming+1 as 排名

FROM

(SELECT b.id, b.score

FROM grade b

WHERE b.kemu = '数学'

ORDER BY score

DESC) AS t,

(SELECT @paiming := 0) r,

student a

WHERE a.id = t.id

1f1d3b948b7428c00c63a5f32c60ca02.png

同结果名次相同

上图由于同一个分数的小伙伴,排名不一样,本着公平、公正、公开的原则,同一分数名次一样

SELECT

t.id, a.name,t.score as 数学分数,

(CASE

WHEN @temp = t.score THEN

@paiming

WHEN @temp := t.score THEN

@paiming :=@paiming + 1

WHEN @temp = 0 THEN

@paiming :=@paiming + 1

END) AS num

FROM

(SELECT b.id, b.score

FROM grade b

WHERE b.kemu = '数学'

ORDER BY score

DESC) AS t,

(SELECT @paiming := 0, @temp := 0) r,

student a

WHERE a.id = t.id

036be2fe79fafab03c9d302e49451fc4.png

排名相同的占个名次

SELECT obj.id, obj.score as 数学,

@rownum := @rownum + 1 AS num_tmp,

@incrnum := (CASE

WHEN @rowtotal = obj.score THEN

@incrnum

WHEN @rowtotal := obj.score THEN

@rownum

END) AS 排名

FROM

(SELECT id, score

FROM grade

WHERE kemu = "数学"

ORDER BY

score DESC

) AS obj

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值