主题:求助:关于成绩分析统计的问题~~
coffeenight
[专家分:230] 发布于 2008-06-11 16:33:00
如下代码,如果科目没有人及格,那么这门科目就不会显示在最后的统计表里,有没有办法避免出现这种情况
select 科目代码,科目,count(*) as 及格人数;
from 成绩表;
where 成绩 >= 60;
group by 科目代码;
into cursor 及格人数
下面这句用来统计实考人数,如果需要统计报考人数,是不是还需要再写一句select语句,能不能一句Select就能统计出 报考人数与实考人数
select 科目代码,科目,count(*) as 实考人数;
from 成绩表;
where 成绩>0
group by 科目代码;
into cursor 实考人数
以下这句语句是不是有更便捷的写法
select 成绩表.科目代码,实考人数.实考人数,及格人数.及格人数,及格率.及格率
from 成绩表,实考人数,及格人数,及格率;
where 成绩表.科目代码=选课人数.科目代码 and 及格人数.科目代码 =实考人数.科目代码 and 成绩表.科目代码 =及格人数.科目代码 and 及格率.科目代码=成绩表.科目代码;
group by 成绩表.科目代码
因为都是相关的问题,所以放在同一个贴子里了。
以评分方式感谢回复!
回复列表 (共7个回复)
沙发
cbl518 [专家分:57140] 发布于 2008-06-11 17:06:00
SELECT 科目代码,科目,SUM(IIF(成绩 >= 60,1,0)) 及格人数,count(*) 实考人数 ;
FROM 成绩表 GROUP BY 科目代码 WHERE 成绩>0 INTO CURSOR 及格人数
板凳
cbl518 [专家分:57140] 发布于 2008-06-11 17:12:00
SELECT 科目代码,科目,SUM(IIF(成绩 >= 60,1,0)) 及格人数,count(*) 实考人数 ;
SUM(IIF(成绩 >= 60,1,0))/count(*) 合格率 ;
FROM 成绩表 GROUP BY 科目代码 WHERE 成绩>0 INTO CURSOR 成绩统计表
3 楼
laon [专家分:180] 发布于 2008-06-11 17:45:00
[quote]SELECT 科目代码,科目,SUM(IIF(成绩 >= 60,1,0)) 及格人数,count(*) 实考人数 ;
SUM(IIF(成绩 >= 60,1,0))/count(*) 合格率 ;
FROM 成绩表 GROUP BY 科目代码 WHERE 成绩>0 INTO CURSOR 成绩统计表
[/quote]
clb老师,这里有sum(0)或sum(1)和count(*)是什么意思,为什么后面可直接跟及格人数或实考人数而不用分隔符?
4 楼
cbl518 [专家分:57140] 发布于 2008-06-11 17:54:00
[quote]这里有sum(0)或sum(1)和count(*)是什么意思,为什么后面可直接跟及格人数或实考人数而不用分隔符?[/quote]
这里是把所有的合乎 >=60 条件的每条记录 赋值为 1 ,再把他们求和。
as 可以省略的,添加上更好,只是一种习惯,没什么技术奥妙。
5 楼
laon [专家分:180] 发布于 2008-06-12 08:45:00
嘿嘿,学的比较死,把马甲一脱我就不认识了!
6 楼
coffeenight [专家分:230] 发布于 2008-06-12 11:48:00
考试科目代码为“1”或“2”开头,及格分数为 60
考试科目代码为“3”或“4”开头,及格分数为 90
及格分数不一样,带来了不不的麻烦,我只会分开两次处理
另外,有报考,但实考人数为 0 的考试科目, 仍不会出现在最后的成绩统计表里。
7 楼
coffeenight [专家分:230] 发布于 2008-09-04 00:45:00
写完了,把程序发上来,与大家共享
SET TALK OFF
CLEAR ALL
CLOSE ALL
CLEAR
&&处理源表
SELECT subs(zkzh,7,1) as bj,* from 源表 into curs test
&&挑选各班级前50名
SELECT bj from test grou by 1 into array bjsm
SELECT top 50 * from test where bj=bjsm[1,1] order by bj,zf desc into table 成绩50
FOR i=2 to ALEN(bjsm,1)
SELECT top 50 * from test where bj=bjsm[i,1] order by bj,zf desc into array bj50
SELECT 成绩50
APPEND FROM array bj50
ENDFOR
&&处理表结构
SELECT bj,zkzh,'语文'as km,yw as cj,1 as sbm,1 as sbm2 from 成绩50;
union;
SELECT bj,zkzh,'数学'as km,sx as cj,1 as sbm,2 as sbm2 from 成绩50;
union;
SELECT bj,zkzh,'英语'as km,yy as cj,1 as sbm,3 as sbm2 from 成绩50;
union;
SELECT bj,zkzh,'政治'as km,zz as cj,2 as sbm,4 as sbm2 from 成绩50;
union;
SELECT bj,zkzh,'历史'as km,ls as cj,2 as sbm,5 as sbm2 from 成绩50;
union;
SELECT bj,zkzh,'地理'as km,dl as cj,2 as sbm,6 as sbm2 from 成绩50;
into cursor 成绩表
&&分析成绩
SELECT bj,km,count(*) as '参评人数',avg(cj) as 平均分,SUM(IIF((sbm=1 and cj>90)or(sbm=2 and cj>60),1,0)) as 及格人数,SUM(IIF((sbm=1 and cj>90)or(sbm=2 and cj>60),1,0))/count(*)*100 as 及格率,;
SUM(IIF((sbm=1 and cj>120)or(sbm=2 and cj>90),1,0)) as 优秀人数,SUM(IIF((sbm=1 and cj>120)or(sbm=2 and cj>90),1,0))/count(*)*100 as 优秀率;
FROM 成绩表 GROUP BY bj,km order by bj,sbm2 INTO CURSOR 成绩统计表
&&显示结果
sele * from 成绩统计表
&&处理临时表
DROP TABLE 成绩50
CLEAR ALL
CLOSE ALL
CLEAR
SET talk ON
我来回复