描述:
新生数据表:
学号 姓名 年级 班级
111 AA
112 BB
113 CC
120 DD
121 EE
... ..
班级数据表:
年级 班级
2010级 1
2010级 2
2010级 3
2010级 4
条件:
新生人数已知;年级\班级已知;
要求:按学号分班,
新生数据表:
学号 姓名 年级 班级
111 AA
112 BB
113 CC
120 DD
121 EE
... ..
班级数据表:
年级 班级
2010级 1
2010级 2
2010级 3
2010级 4
条件:
新生人数已知;年级\班级已知;
要求:按学号分班,
解决方案 »
- 哪位老兄帮忙看看sql2000写在作业里的语句
- 求一数据库求平均分的问题.本来数据类型是int.查询结果没有小数点.内详
- 想用isnull函数,但是select出来的不是null值
- 【简单问题】如何实现列横排,up有分
- sql触法,时间如何判断。
- 一个奇怪的外联接请求问题。
- 帮帮忙啊!在线等待!!十万火急
- 有关于数据服务器的安装?
- 磁卡、IC卡、条码?
- asp做的b/s结构程序需要下面的功能:在客户端把多个server的数据库添加至客户端的一个数据库,因为客户端作为管理中心
- sql sever中如何对用户授权,使用户只能查阅自己的相关资料?
- 在SQL中,如何将字符串'00EDDAFB'转换为十六进制的数值0x00EDDAFB.
insert into tb1 values('111','AA',null,null)
insert into tb1 values('112','BB',null,null)
insert into tb1 values('113','CC',null,null)
insert into tb1 values('120','DD',null,null)
insert into tb1 values('121','EE',null,null)
insert into tb1 values('122','FF',null,null)
insert into tb1 values('123','GG',null,null)
insert into tb1 values('124','HH',null,null)
insert into tb1 values('125','II',null,null)
insert into tb1 values('126','JJ',null,null)
create table tb2(年级 varchar(10),班级 int)
insert into tb2 values('2010级', 1)
insert into tb2 values('2010级', 2)
insert into tb2 values('2010级', 3)
insert into tb2 values('2010级', 4)
go
declare @cnt as int
select @cnt = count(*) from tb2select t1.学号,t1.姓名,t2.年级,t2.班级 from
(
select *,((px-1)%@cnt) + 1 banji from
(
SELECT *,px=(SELECT COUNT(DISTINCT 学号) FROM tb1 WHERE 学号 < a.学号) + 1 FROM tb1 a
) t
) t1,
(
SELECT *,px=(SELECT COUNT(1) FROM tb2 WHERE 年级 < a.年级 or (年级 = a.年级 and 班级 < a.班级)) + 1 FROM tb2 a
) t2
where t1.banji = t2.px
order by t1.学号drop table tb1,tb2/*
学号 姓名 年级 班级
----------- ---------- ---------- -----------
111 AA 2010级 1
112 BB 2010级 2
113 CC 2010级 3
120 DD 2010级 4
121 EE 2010级 1
122 FF 2010级 2
123 GG 2010级 3
124 HH 2010级 4
125 II 2010级 1
126 JJ 2010级 2(所影响的行数为 10 行)
*/
1\学号的顺序实际上就是分数的排序,不能随机选;
2\要用update语句更新tb1中的年级和班级;
比如:(说明:第1名,就是第一个学号;第2名,就是第二个学号...)
假设:第1名->1班 ;第2名->3班;第3名->2班;第4名->4班
必定:第5名->1班 ;第6名->3班;第7名->2班;第8名->4班
declare @cnt as int
select @cnt = count(*) from tb2select t1.学号,t1.姓名,t2.年级,t2.班级 from
(
select *,((px-1)%@cnt) + 1 banji from
(
SELECT *,px=(SELECT COUNT(DISTINCT 学号) FROM tb1 WHERE 分数 < a.分数) + 1 FROM tb1 a
) t
) t1,
(
SELECT *,px=(SELECT COUNT(1) FROM tb2 WHERE 年级 < a.年级 or (年级 = a.年级 and 班级 < a.班级)) + 1 FROM tb2 a
) t2
where t1.banji = t2.px
order by t1.学号
set 年级 = t.年级,班级 = t.班级
from t1,(select t1.学号,t1.姓名,t2.年级,t2.班级 from
(
select *,((px-1)%@cnt) + 1 banji from
(
SELECT *,px=(SELECT COUNT(DISTINCT 学号) FROM tb1 WHERE 学号 < a.学号) + 1 FROM tb1 a
) t
) t1,
(
SELECT *,px=(SELECT COUNT(1) FROM tb2 WHERE 年级 < a.年级 or (年级 = a.年级 and 班级 < a.班级)) + 1 FROM tb2 a
) t2
where t1.banji = t2.px
order by t1.学号
) t
where t1.学号 = t.学号
declare @New table (学号 int,姓名 varchar(2),年级 varchar(6),班级 int)
insert @New
select 111,'AA',null,null union all
select 112,'BB',null,null union all
select 113,'CC',null,null union all
select 120,'DD',null,null union all
select 121,'EE',null,null
--原始数据:@Grade
declare @Grade table (年级 varchar(6),班级 int)
insert @Grade
select '2010级',1 union all
select '2010级',2 union all
select '2010级',3 union all
select '2010级',4--新生随机
create table #New (SID int identity,学号 int,姓名 varchar(2))
insert #New(学号,姓名) select 学号,姓名 from @New order by newid()declare @Max int,@年级 varchar(6)
set @年级='2010级'create table #Class (CID int identity,班级 int)
--班级随机:否则“新生数/班级”的余数部分,只能随机分配给前面的班级:
insert #Class(班级) select 班级 from @Grade where 年级=@年级 order by newid()
select @Max=@@rowcountupdate @New set 年级=@年级,班级=c.班级
from @New a
inner join #New b on a.学号=b.学号
inner join #Class c on b.SID%@Max+1=c.CIDselect * from @New
/*
学号 姓名 年级 班级
----------- ---- ------ -----------
111 AA 2010级 4
112 BB 2010级 3
113 CC 2010级 4
120 DD 2010级 2
121 EE 2010级 1
*/drop table #New,#Class