首页 > 试题广场 >

有一张学生成绩表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)
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 回复(2)
我还以为表数据1个学生只有一行数据。。。。
原来是要求答案1个学生只有一行数据😂😂😂😂😂
发表于 2020-01-14 09:41:58 回复(5)
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>要求一个学生只有一行数据,所以用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)
<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)
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)
不用sum的话,if 判断出来的新表会生成成绩为0的字段,需要用sum合并掉这些成绩为0的字段
发表于 2025-05-12 10:24:43 回复(0)

关于比D少一个group by 的B选项错误原因:
如果在你的 SQL 查询中没有使用 GROUP BY 子句,那么查询会产生不同的结果。具体来说,没有 GROUP BY 会导致整个表的数据作为一个整体进行汇总,而不是按每个学生编号(sno)分组进行聚合。

没有 GROUP BY 的情况:

考虑以下修改后的 SQL 语句:

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)进行分组。SUM() 聚合函数将会应用于整个表(满足 WHERE 条件的记录),并且数据库将计算所有记录的总和。
  • sno:由于不进行分组,返回的 sno 列的值不确定,因为 sno 没有在聚合函数中,数据库在执行查询时可能会选择表中的任意一行的 sno

查询结果:

假设表 sc 的数据如下:

sno class score
101 english 85
101 math 90
102 english 75
102 math 88
103 english 92

执行没有 GROUP BY 的查询后,结果可能会是:

sno english math
101 252 178
  • englishSUM(IF(class = 'english', score, 0)) 将所有英语成绩(85 + 75 + 92 = 252)相加。
  • mathSUM(IF(class = 'math', score, 0)) 将所有数学成绩(90 + 88 = 178)相加。
  • sno:由于没有 GROUP BY,数据库会随机选择一个 sno 值来显示,通常是表中的第一个记录的 sno 值(在本例中为 101)。

总结:

  • 如果没有 GROUP BY,那么查询会将整个表的数据视为一个整体来进行汇总,而不会按照每个学生编号来分组。
  • 结果只会显示所有记录的汇总,而不是针对每个学生的英语和数学成绩进行分别统计。
  • 显示的 sno 可能是不确定的,因为在没有分组的情况下,数据库可能会选择表中的任意一条记录的 sno 来显示。
发表于 2024-09-13 10:19:17 回复(0)
就没有人发现有bug吗 我手机上D选项显示的不全 没有分组的语句
发表于 2021-04-21 17:48:41 回复(0)