SQL:用SQL统计学生成绩 原来有这么多玩法

  • 准备数据
  1. 建表

CREATE TABLE `stuscore` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `subject` varchar(50) DEFAULT NULL,
  `score` bigint(20) DEFAULT NULL,
  `stuid` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8
  1. 测试数据
insert into test.stuscore(name,subject,score,stuid) values ('张三','数学',89,1);
insert into test.stuscore(name,subject,score,stuid) values ('张三','语文',80,1);
insert into test.stuscore(name,subject,score,stuid) values ('张三','英语',70,1);
insert into test.stuscore(name,subject,score,stuid) values ('李四','数学',90,2);
insert into test.stuscore(name,subject,score,stuid) values ('李四','语文',70,2);
insert into test.stuscore(name,subject,score,stuid) values ('李四','英语',80,2);
  • 原表数据
    SQL:用SQL统计学生成绩 原来有这么多玩法_第1张图片
  • 根据需求写SQL
  1. 需求: 把原表数据统计如下
    在这里插入图片描述
  2. SQL实现
    方式一
select
   stuid 学号,
   name 姓名,
   (case when subject = '语文' then score else 0 end )as 语文,
   (case when subject = '数学' then score else 0 end )as 数学,
   (case when subject = '英语' then score else 0 end )as 英语
	
from
   stuscore
group by
   stuid,
   name
order by
   总分;

方式二

select
   stuid 学号,
   name 姓名,
   max(case when subject = '语文' then score else 0 end )as 语文,
   max(case when subject = '数学' then score else 0 end )as 数学,
   max(case when subject = '英语' then score else 0 end )as 英语,
   max(score) 最高分,
   SUM(score)总分,
   avg(score)平均分
from
   stuscore
group by
   stuid,
   name
order by
   总分;

你可能感兴趣的:(面试-笔试,sql)