关于SQL分组抽签的语句,select top N
遇到一个难题,如下:有个学生表Student,字段:SID(学生编号)、ClassID(班级编号)、Win(0-没抽中、1-抽中)有个任务表Task,字段:ClassID...
遇到一个难题,如下:
有个学生表Student,字段:SID(学生编号)、ClassID(班级编号)、Win(0-没抽中、1-抽中)
有个任务表Task,字段:ClassID(班级编号)、sNum(抽调人数)
现根据任务表,每个班级随机抽调一些学生去劳动,要求把抽中的学生Win字段更新为1
还要一条SQL语句完成,请问如何实现? 展开
有个学生表Student,字段:SID(学生编号)、ClassID(班级编号)、Win(0-没抽中、1-抽中)
有个任务表Task,字段:ClassID(班级编号)、sNum(抽调人数)
现根据任务表,每个班级随机抽调一些学生去劳动,要求把抽中的学生Win字段更新为1
还要一条SQL语句完成,请问如何实现? 展开
1个回答
展开全部
我不知道你的抽取人数一样不,如果要总共抽取N个人然后随机分配给每个班,则可以用下边的代码:
update student set win = 1 where sid in (select top (select sum(snum) from task) sid from student order by newid())
如果是每个班抽取同样的人数,或者每个班抽取不同的人数,则需要再连接个classid,然后分组计算出每个班级的sid即可,如果不会可以追问
update student set win = 1 where sid in (select top (select sum(snum) from task) sid from student order by newid())
如果是每个班抽取同样的人数,或者每个班抽取不同的人数,则需要再连接个classid,然后分组计算出每个班级的sid即可,如果不会可以追问
更多追问追答
追问
您给的代码是用总中奖人数全校任意分配。我这里需要对每个班级指定人数,且人数不一样。存放在Task表里。您说要再连接一个Classid,好像也实现不了,我不是很明白,请赐教!
追答
我想了一下,最后连上classid后不太好取随机数,我又给你换了种写法,要求你的版本要是2005+的,代码如下:
update student set win = 1 where sid in (select sid from (select ROW_NUMBER() over(partition by classid order by newid()) AS N,* from student)a
where N <= (select snum from task where classid = a.classid)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询