这种数据处理用sql怎么写?

来源:百度知道 编辑:UC知道 时间:2024/06/24 15:34:15
诸位高手,我这道疑问是针对一个高校中的算课时量的例子,比如下面示例数据
Tname Cname Number Class
Jim Maths 60 计算机1班
Jim Maths 120 计算机2班
Jim Maths 180 计算机3班
Jim physics 180 计算机3班
Jim physics 120 计算机2班
bob Maths 100 自动化1班
bob computer 120 计算机2班

要求:如果一位老师教授有重复课,则将教授重复课的班人数最大的一行中xs列置1,这位老师这门课其

余的班所对应的xs列均为0.7,如果这名老师没有教授重复课,那么xs为1,这位老师的标准课时量是总课

时以xs(系数)列中的值,对于本例中,最后用sql server达到的效果就是如下:
Tname Cname Number Class xs
Jim Maths 60 计算机1班 0.7
Jim Maths 120 计算机2班 0.7
Jim Maths 180 计算机3班 1
Jim physics 180 计算机3班 1
Jim physics 120 计算机2班 0.7
bob Maths 100 自动化1班 1
bob computer 120 计算机2班 1

请问怎么实现这一过程呢?因为实际的数据量很大,有好几万条,所以想寻求一种简单方法。

/*表名为tc*/
declare
cursor cur_tname is select tname from tc group by tname,cname;
max_class tc.class%type;
begin
for i in cur_tname loop/*按教师和课程顺序找出不同组合*/
select max(num) into max_class from tc where tname like i.tname and cname like i.cname;/*找到同教师同课程的人数最多的班级*/
update tc set xs=1 where tname like i.tname and cname like j.cname and num=max_class;/*设置xs=1*/
end loop;
update tc set xs=0.7 where xs<>1;/*设置其它班级xs=0.7*/
commit;
exception
when others then
dbms_output.put_line('have error:'||sqlerrm);
rollback;
end;
/

建联合索引,包含tname,cname两个字段
然后设置人数最大的(如果两个班人数相等,且都是最大,那么都被置成1)
update table1 set xs=1 where (tname,cname,number) in (
select tname,cname,max(number) from table1 group by tanme,cname
);
最后再 update table1 set xs=0.7 where xs is null;