回 帖 发 新 帖 刷新版面

主题:求助:关于成绩分析统计的问题~~

如下代码,如果科目没有人及格,那么这门科目就不会显示在最后的统计表里,有没有办法避免出现这种情况
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个回复)

沙发

SELECT 科目代码,科目,SUM(IIF(成绩 >= 60,1,0)) 及格人数,count(*) 实考人数 ;
FROM 成绩表 GROUP BY 科目代码 WHERE 成绩>0 INTO CURSOR 及格人数

板凳

SELECT 科目代码,科目,SUM(IIF(成绩 >= 60,1,0)) 及格人数,count(*) 实考人数 ;
       SUM(IIF(成绩 >= 60,1,0))/count(*) 合格率 ;
FROM 成绩表 GROUP BY 科目代码 WHERE 成绩>0 INTO CURSOR 成绩统计表

3 楼

[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 楼

[quote]这里有sum(0)或sum(1)和count(*)是什么意思,为什么后面可直接跟及格人数或实考人数而不用分隔符?[/quote]


这里是把所有的合乎 >=60 条件的每条记录 赋值为 1 ,再把他们求和。

as 可以省略的,添加上更好,只是一种习惯,没什么技术奥妙。

5 楼


嘿嘿,学的比较死,把马甲一脱我就不认识了!

6 楼

考试科目代码为“1”或“2”开头,及格分数为  60 
考试科目代码为“3”或“4”开头,及格分数为  90
及格分数不一样,带来了不不的麻烦,我只会分开两次处理

另外,有报考,但实考人数为 0 的考试科目, 仍不会出现在最后的成绩统计表里。

7 楼

写完了,把程序发上来,与大家共享
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

我来回复

您尚未登录,请登录后再回复。点此登录或注册