日期:2014-05-18  浏览次数:20417 次

求助一条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 组号