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

mfb82 2008-04-25 01:37:55

诸位高手,我这道疑问是针对一个高校中的算课时量的例子,比如下面示例数据
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达到的效果就是把xs列置数如下:
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


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

出来了用我这例子实际运行一下看看能否通过,请不要想当然的写,谢谢

...全文
118 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxq619 2008-04-25
  • 打赏
  • 举报
回复
这样试了也行
select * ,xs= (
case when tname+
cname+convert(varchar(30),number) in
(select tname+cname + convert( varchar(30),max(number)) from tp3 group by tname,cname)
then 1 else 0.7 end)
from tp3
Limpire 2008-04-25
  • 打赏
  • 举报
回复
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (Tname varchar(3),Cname varchar(8),Number int,Class varchar(9))
insert into #T
select 'Jim','Maths',60,'计算机1班' union all
select 'Jim','Maths',120,'计算机2班' union all
select 'Jim','Maths',180,'计算机3班' union all
select 'Jim','physics',180,'计算机3班' union all
select 'Jim','physics',120,'计算机2班' union all
select 'bob','Maths',100,'自动化1班' union all
select 'bob','computer',120,'计算机2班'

select Tname,Cname,Number,Class,(case c when 1 then 1 else case when Number=m then 1 else 0.7 end end)cs from
(
select *,count(1)over(partition by TName,CName)c, max(Number)over(partition by TName,CName)m from #T
) t
/*
Tname Cname Number Class cs
----- -------- ----------- --------- -----------
bob computer 120 计算机2班 1.0
bob Maths 100 自动化1班 1.0
Jim Maths 60 计算机1班 0.7
Jim Maths 120 计算机2班 0.7
Jim Maths 180 计算机3班 1.0
Jim physics 180 计算机3班 1.0
Jim physics 120 计算机2班 0.7
*/
dawugui 2008-04-25
  • 打赏
  • 举报
回复
create table tb(Tname varchar(10) , Cname varchar(10) , Number int,Class varchar(10))
insert into tb values('Jim' ,'Maths' , 60 ,'计算机1班')
insert into tb values('Jim' ,'Maths' , 120 ,'计算机2班')
insert into tb values('Jim' ,'Maths' , 180 ,'计算机3班')
insert into tb values('Jim' ,'physics', 180 ,'计算机3班')
insert into tb values('Jim' ,'physics', 120 ,'计算机2班')
insert into tb values('bob' ,'Maths' , 100 ,'自动化1班')
insert into tb values('bob' ,'computer' ,120 ,'计算机2班')
go

select n.* , xs = 0.7 from tb n where not exists(select 1 from (select tname,cname,number from tb t where number = (select max(number) from tb where tname = t.tname and cname = t.cname)) m where tname = n.tname and cname = n.cname and number = n.number)
union all
select t.* , xs = 1 from tb t where number = (select max(number) from tb where tname = t.tname and cname = t.cname)
order by tname , cname

drop table tb

/*
Tname Cname Number Class xs
---------- ---------- ----------- ---------- ----
bob computer 120 计算机2班 1.0
bob Maths 100 自动化1班 1.0
Jim Maths 180 计算机3班 1.0
Jim Maths 60 计算机1班 .7
Jim Maths 120 计算机2班 .7
Jim physics 120 计算机2班 .7
Jim physics 180 计算机3班 1.0

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

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧