读书人

怎么计算体育考试的及格率

发布时间: 2012-03-05 11:54:02 作者: rapoo

如何计算体育考试的及格率
现在有如下格式数据表:
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 考试次数,考试类型



--删除测试环境
drop table t

/*--测试结果
考试次数 考试类型 参加考试人数 合格率
----------- ---------- ----------- ----------
1 体育 3 33.33%
2 体育 3 33.33%
3 体育 1 0.00%

(所影响的行数为 3 行)
*/
/*

读书人网 >SQL Server

热点推荐