如何计算体育考试的及格率
现在有如下格式数据表:
id | 学号 | 成绩 | 考试次数 | 考试类型
1 | aaa | 56 | 1 | 体育
2 | bbb | 60 | 1 | 体育
3 | ccc | 58 | 1 | 体育
4 | aaa | 30 | 2 | 体育
5 | bbb | 69 | 2 | 体育
6 | ccc | 45 | 2 | 体育
7 | aaa | 29 | 3 | 体育
......................................
要生成如下表格
考试次数 | 类型 | 参加考试人数 | 合格率
1 | 体育 | 3 | 33.3%
------解决方案--------------------select 考试次数,考试类型,
count(*) as 参加考试人数,
cast(cast(100.0*sum(case when 成绩> =60 then 1 else 0 end)/count(*) as numeric(10,2)) as varchar(10))+ '% ' as 合格率
from 数据表
group by 考试次数,考试类型
------解决方案--------------------上面numeric(10,2)应该改为numeric(10,1)
以上会出三条记录
如果只要一条记录
select 考试次数,考试类型,
count(*) as 参加考试人数,
cast(cast(100.0*sum(case when 成绩> =60 then 1 else 0 end)/count(*) as numeric(10,1)) as varchar(10))+ '% ' as 合格率
from 数据表
where 考试次数=1 and 考试类型= '体育 '
group by 考试次数,考试类型
------解决方案----------------------创建测试环境
create table t(id int,学号 varchar(10),成绩 numeric(5,2),考试次数 int,考试类型 varchar(10))
--插入测试数据
insert t(id,学号,成绩,考试次数,考试类型)
select '1 ', 'aaa ', '56 ', '1 ', '体育 ' union all
select '2 ', 'bbb ', '60 ', '1 ', '体育 ' union all
select '3 ', 'ccc ', '58 ', '1 ', '体育 ' union all
select '4 ', 'aaa ', '30 ', '2 ', '体育 ' union all
select '5 ', 'bbb ', '69 ', '2 ', '体育 ' union all
select '6 ', 'ccc ', '45 ', '2 ', '体育 ' union all
select '7 ', 'aaa ', '29 ', '3 ', '体育 '
--求解过程
select 考试次数,考试类型,count(1) as 参加考试人数
,convert(varchar(20),convert(numeric(18,2)
,sum(case when 成绩 > = 60 then 1 else 0 end)*100
/convert(numeric(18,2),count(1))))+ '% ' as 合格率
from t
group by 考试