求助一条SQL(关于运动会分组问题)
需求:学校开运动会:对一群人进行分组比赛:
分组的原则:假设每组4个人比赛
1.第1组分人原则:首先从参赛人员最多的部门中,选择1人;然后从部门第2多的人选择1人;依次继续,直到每个部门人都选完了;再从第1个部门选择,直到第一组分完为止
2.第2组分人原则和第1组分人原则一样:重新从部门最多的人中选取1人,依次继续
(这一点很重要,如果是依次从部门选则人,我这边就可以实现)
3.后续分组原则和之前一样:
表格为:
create table t_t(a varchar(10) not null,id varchar(10))
insert t_t values( '机电 ', 'a ')
insert t_t values( '机电 ', 'b ')
insert t_t values( '机电 ', 'c ')
insert t_t values( '计算机 ', 'e ')
insert t_t values( '电信 ', 'f ')
insert t_t values( '材料 ', 'g ')
insert t_t values( '汽车 ', 'h ')
insert t_t values( '文法 ', 'i ')
insert t_t values( '人文 ', 'g ')
insert t_t values( '管理 ', 'k ')
insert t_t values( '外语 ', 'l ')
insert t_t values( '土木 ', 'm ')
如果每组比赛4个人:我期望的排序结果(如果有正确的排序,后面一切都OK了)
a id
机电 a
计算机e
电信 f
材料 g
机电 b
汽车 h
文法 i
人文 g
机电 c
管理 k
外语 l
土木 m
这样的好处是:每组没有重复部门的人比赛
如果用:select a.a,a.id,count(*) as num From t_t a,t_t b where a.a=b.a and a.id> =b.id
group by a.a,a.id order by num,a.a,a.id
输出结果为:
材料 g 1
电信 f 1
管理 k 1
机电 a 1
计算机 e 1
汽车 h 1
人文 g 1
土木 m 1
外语 l 1
文法 i 1
机电 b 2
机电 c 3
最后一组有2个机电的人参加比赛:不符合规则.
不知道有哪位大侠能够实现.谢谢
------解决方案--------------------create table t_t(a varchar(10) not null,id varchar(10))
insert t_t values( '机电 ', 'a ')
insert t_t values( '机电 ', 'b ')
insert t_t values( '机电 ', 'c ')
insert t_t values( '计算机 ', 'e ')
insert t_t values( '电信 ', 'f ')
insert t_t values( '材料 ', 'g ')
insert t_t values( '汽车 ', 'h ')
insert t_t values( '文法 ', 'i ')
insert t_t values( '人文 ', 'g ')
insert t_t values( '管理 ', 'k ')
insert t_t values( '外语 ', 'l ')
insert t_t values( '土木 ', 'm ')
go
--建立存储过程
create proc pr_分组
@num int --每组人数
as
declare @n int
declare @i int
declare @r table (a varchar(10) not null,id varchar(10),组号 int)
declare @t table (a varchar(10) not null,id varchar(10))
declare @a varchar(10)
declare @id varchar(10)
insert @t select a,id from t_t
set @i=1
while exists (select 1 from @t)
begin
set @n=@num
while @n> 0
begin
select top 1 @a=a,@id=id from @t a where not exists (select 1 from @r where 组号=@i and a=a.a)
order by (select count(*) from @t where a=a.a) desc,id
insert @r select a,id,@i from @t where id=@id and a=@a
delete @t where id=@id and a=@a
set @n=@n-1
end
set @i=@i+1
end
--显示结果
select * from @r
go
--测试
exec pr_分组 4
--结果
a id 组号