日期:2014-05-18  浏览次数:20549 次

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