有一个表,叫做student,结构如下:
学校名称 学生姓名 语文 数学
A 张三 78 21
A 李四 86 99
B 爱迪生 33 36
A 张三丰 100 45
B 吴彦祖 45 51
B 张韶涵 23 62
...........................要求统计结果格式如下:学校名称 语文平均分 语文及格率 数学平均分 数学及格率
A 35 27.21% 38 31.50%
B 55 78.56% 66 33.66%
也就就是说:要根据学校名称,统计出来学生的平均分和及格率(大于等于60分算及格,保留两位小数),但是吧,学校名称不能一个一个的手动输入查询,因为实在是太多了,我想来想去,也不知道如何查询SQL SERVER有这样的功能语句吗?恳请各位大师指点迷津
学校名称 学生姓名 语文 数学
A 张三 78 21
A 李四 86 99
B 爱迪生 33 36
A 张三丰 100 45
B 吴彦祖 45 51
B 张韶涵 23 62
...........................要求统计结果格式如下:学校名称 语文平均分 语文及格率 数学平均分 数学及格率
A 35 27.21% 38 31.50%
B 55 78.56% 66 33.66%
也就就是说:要根据学校名称,统计出来学生的平均分和及格率(大于等于60分算及格,保留两位小数),但是吧,学校名称不能一个一个的手动输入查询,因为实在是太多了,我想来想去,也不知道如何查询SQL SERVER有这样的功能语句吗?恳请各位大师指点迷津
from student
group by 学校名称
avg(shuxue),shuxue1=(select count(*) from tb where shuxue>60 group by schoolname/select count(*) from tb)
from tb
group by schoolname
from student
group by 学校名称
create table #mytable(
学校名称 char(2),
学生姓名 char(6),
语文 smallint,
数学 smallint
)
insert into #mytable
select 'A','张三',78,21
union all
select 'A','李四',86,99
union all
select 'B' ,'爱迪生',33,36
union all
select 'A','张三丰',100,45
union all
select 'B','吴彦祖',45,51
union all
select 'B','张韶涵',23,62
select 学校名称,语文平均分=avg(语文)
,语文及格率=sum(case when 语文>=60 then 1 else 0 end)*1.0/count(*)
,数学平均分=avg(数学),数学及格率=sum(case when 数学>=60 then 1 else 0 end)*1.0/count(*)
from #mytable
group by 学校名称
insert student
select 'A','张三', 78 ,21 union all
select 'A','李四', 86 ,99 union all
select 'B','爱迪生', 33 ,36 union all
select 'A','张三丰', 100 ,45 union all
select 'B','吴彦祖', 45 ,51 union all
select 'B','张韶涵', 23 ,62
select 学校名称,avg(语文) as 语文平均分,
ltrim(cast(sum(case when 语文>=60 then 1 else 0 end)*100.0/count(*) as decimal(10,2)))+'%' as 语文及格率,
avg(数学) as 数学平均分,
ltrim(cast(sum(case when 数学>=60 then 1 else 0 end)*100.0/count(*) as decimal(10,2)))+'%' as 数学及格率
from student
group by 学校名称/*
学校名称 语文平均分 语文及格率 数学平均分 数学及格率
---- ----------- ----------------------------------------- ----------- -----------------------------------------
A 88 100.00% 55 33.33%
B 33 0.00% 49 33.33%(所影响的行数为 2 行)
*/
insert into student
select 'A','张三', 78, 21
union
select 'A','李四', 86, 99
union
select 'b','爱迪生', 33, 36
union
select 'A','张三丰', 100, 45
union
select 'b','吴彦祖', 45, 51
union
select 'b','张韶涵', 23, 62select a.学校名称,avg(a.语文) as 语文平均分,sum(case when a.语文>=60 then 1.00 else 0.00 end)/cast(count(*) as decimal(5,2)) as 语文及格率,
avg(a.数学) as 数学平均分,sum(case when a.数学>=60 then 1.00 else 0.00 end)/count(*) as 数学及格率 from student a
group by a.学校名称
insert into student
select 'A','张三', 78, 21
union
select 'A','李四', 86, 99
union
select 'b','爱迪生', 33, 36
union
select 'A','张三丰', 100, 45
union
select 'b','吴彦祖', 45, 51
union
select 'b','张韶涵', 23, 62select a.学校名称,cast(avg(a.语文) as decimal(5,2)) as 语文平均分,
rtrim(cast(sum(case when a.语文>=60 then 1.00 else 0.00 end)/count(*)*100 as decimal(5,2)))+'%' as 语文及格率 ,
cast(avg(a.数学) as decimal(5,2)) as 数学平均分,
rtrim(cast(sum(case when a.数学>=60 then 1.00 else 0.00 end)/count(*)*100 as decimal(5,2)))+'%' as 数学及格率
from student a
group by a.学校名称