我有一个包含组('G1','G2'等)的表和一个包含人('P1','P2'等...)和am:m之间关系的表,所以一个用户可以属于多个组,一个组由多个用户组成。
我有一条规则,只有当每个组中有一定数量的成员存在时才会满足(即至少有两个G1成员和至少一个G2成员必须存在),并且我有一个用户列表存在。一个人不能满足一个以上的要求,所以如果P1和P2都是G1和G2的成员,规则仍然需要第三人,可以是G1或G2的成员。
任何想法如何在SQL Server中完成?
创建脚本:
create table Groups (GroupID int, Name nvarchar(100))
insert into Groups values (1, 'First')
insert into Groups values (2, 'Second')
insert into Groups values (3, 'Third')
create table Persons (PersonID int, Name nvarchar(100))
insert into Persons values (1, 'One')
insert into Persons values (2, 'Two')
insert into Persons values (3, 'Three')
insert into Persons values (4, 'Four')
insert into Persons values (5, 'Five')
insert into Persons values (6, 'Six')
create table PersonGroups (PersonID int, GroupID int)
-- p1 and p2 are members of g1
insert into PersonGroups values (1, 1)
insert into PersonGroups values (2, 1)
-- p2, p3 and p4 are members of g2
insert into PersonGroups values (2, 2)
insert into PersonGroups values (3, 2)
insert into PersonGroups values (4, 2)
-- p2, p4, p5 and p6 are members of g3
insert into PersonGroups values (2, 3)
insert into PersonGroups values (4, 3)
insert into PersonGroups values (5, 3)
insert into PersonGroups values (6, 3)
所以,如果规则要求每个组中的一个人出现(1,3,5),(1,2,3),(2,3,4)将是有效的,并且(3,5, 6)无效。
答案 0 :(得分:0)
为规则创建标头表
create table #ruleset (Id int, name varchar(100))
insert into #ruleset
select 1,'At least 1 person from each group'
为每个规则创建子表,每个规则包含许多条目。
drop table #ruleset_grouprules
create table #ruleset_Grouprules(Id int identity(1,1), RuleId int,
GroupID int, MinUsers int, MaxUsers int)
insert into #ruleset_Grouprules (RuleId, groupId, MinUsers, MaxUsers)
select 1,1,1,null
union all
select 1,2,1,null
union all
select 1,3,1,null
此查询将显示组规则是否已通过。
select r.id, r.Name, gr.GroupId,
case when x.GroupQty>=isnull(gr.MinUsers, x.GroupQty)
and x.GroupQty<=isnull(gr.MaxUsers, x.GroupQty)
then 1 else 0 end as GroupValid
from #ruleset r
join #ruleset_Grouprules gr on gr.RuleId=r.Id
join (
select g.groupID, count(*) GroupQty
from #Groups g
join #PersonGroups pg on pg.GroupID=g.GroupID
join #Persons p on p.PersonID=pg.PersonID
group by g.GroupID
)x on x.GroupID=gr.GroupID
然后,您可以对此查询进行汇总,以便将sum(GroupValid)=count(*)
与group by r.id
进行比较,以检查整个规则是否有效。我就这样离开了,所以你可以看到工作数据。