首页 > 试题广场 >

有一张学生成绩表sc(sno 学号,class 课程,sco

[单选题]
有一张学生成绩表sc(sno 学号,class 课程,score 成绩),示例如下:

请问哪个语句可以查询出每个学生的英语、数学的成绩(行转列,一个学生输出一行记录,比如输出[1, 89, 90])?
  • select sno,class,score from sc where class in('english','math')
  • select sno,
    if(class='english',score,0),
    if(class='math',score,0)
    from sc
    where class in('english','math')
  • select sno,
    case when class='english' then score else 0 end ,
    case when class='math' then score else 0 end
    from sc
    where class in('english','math')
  • select sno,
    sum(if(class='english',score,0)) as english,
    sum( if(class='math',score,0) ) as math
    from sc
    where class in('english','math')
    group by sno
错误答案C:没达到行转列的目的
select sno,
case when class='english' then score else 0 end ,
case when class='math' then score else 0 end
from sc
where class in('english','math')
结果:一个学生最终会出现两条记录(英语和数学),每条记录都是满足当前class条件的那门课程成绩正常,其余课程成绩为0
张三 80 0
张三 0 79
王五 60 0
王五 0 88
修改为:
select sno,
sum(case when class='english' then score else 0 end ) as english,
sum(case when class='math' then score else 0 end) as math
from sc
where class in('english','math')
group by sno;

正确答案D:
 select sno,
sum(if(class='english',score,0)) as english,
sum( if(class='math',score,0) ) as math
from sc
where class in('english','math')
group by sno
如果科目为English为真,English成绩+score,否则+0!!!
结果:
张三 80 79
王五 60 88

发表于 2020-09-08 09:15:38 回复(2)
mysql执行顺序是先找from表,然后再where,然后Group by这些,最后Select后的语句。
这道题先找到这个表,再看where后,只把class为英语数学的筛选出来,然后通过学号分组,每个学生的成绩放到一条记录里,英语数学成绩这两个字段便是查找完每个学生的记录后得到的,需要用到sum

发表于 2020-03-20 14:26:19 回复(6)
<p>此题C项不对的原因是缺少了分组聚合,因为每个学生是有多门课的成绩的。例:case when class=‘english’ then score else 0 end,此时会出现一条英语成绩正常,其他科目成绩为0的记录,以此类推一个学生最终会出现多条记录,每条记录都是满足当前class条件的那门课程成绩正常,其余课程成绩为0,为了满足行转列且每个学生一条记录,那么还需要对生成的结果按照学号分组聚合(此处sum、max、min都行)</p>
发表于 2020-07-04 22:30:21 回复(5)
我还以为表数据1个学生只有一行数据。。。。
原来是要求答案1个学生只有一行数据😂😂😂😂😂
发表于 2020-01-14 09:41:58 回复(5)
sum函数作用:不加的话就会导致 
sno english math
1 90 0
1 0 85
而我们想要的结果是
sno english math
1 90 85  将上面2条记录合并就正常啦!  

group by作用:不加会导致所有学生英语成绩都加在一起,数学成绩也会加在一起
sno english math
1 185 165

发表于 2020-12-22 23:21:53 回复(1)
sum(if(class='english',score,0)) as english,
class='english'为真English加score;否则,加0
发表于 2020-02-25 00:10:25 回复(2)
/**
如图所示正确答案
*/

/**
加sum的目的
*/


编辑于 2020-10-19 15:37:46 回复(4)
为什么还要sum啊      1个课程  几个成绩啊?
发表于 2019-09-08 15:00:10 回复(5)
<p>if(条件,结果1,结果2)类似条件?结果1:结果2</p>
发表于 2020-05-02 13:30:58 回复(0)
这个时候需要group  by
发表于 2019-08-26 09:43:33 回复(0)
发表于 2021-07-29 11:10:00 回复(0)
<p>要求一个学生只有一行数据,所以用group by学号 进行分组。使用group by 语句时,select的字段要么是group by 后面的字段,要么是被聚合函数包裹的。这里用sum,min,max可能都行没试过。然后就是if(判定条件,结果1,结果2)和java中if 条件?结果1,结果2一样</p>
发表于 2021-01-12 21:27:12 回复(0)
sum(if(class='english',score,0)) as english,
sum( if(class='math',score,0) ) as math
如果科目为English为真,English+score,否则+0!!!
发表于 2020-06-08 14:53:27 回复(0)
SELECT sno,
SUM(IF(`class`='语文',score,0)) as '语文',
SUM(IF(`class`='数学',score,0)) as '数学'
FROM score 
where class in('语文','数学')
GROUP BY sno
标准答案,哈哈哈
发表于 2019-10-14 20:48:04 回复(2)
请问为啥要用sum啊
发表于 2020-09-20 20:03:45 回复(0)
分组函数要配合聚合函数使用。
发表于 2020-07-01 15:10:45 回复(0)
只要做错了100%是顺丰的题😂
发表于 2019-08-07 15:14:12 回复(1)
就没有人发现有bug吗 我手机上D选项显示的不全 没有分组的语句
发表于 2021-04-21 17:48:41 回复(0)
题目要求行转列,必须用group by分组查询
发表于 2023-10-16 11:42:59 回复(0)
注意sum函数,每次扫描表行时,多行数据,英语和数学成绩不能同时满足被扫描,所以利用sum可以达到这个目的
发表于 2022-11-24 19:41:07 回复(0)