首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >小组成员以最大限度地达到每一组的配额(MS访问)

小组成员以最大限度地达到每一组的配额(MS访问)
EN

Stack Overflow用户
提问于 2012-01-10 08:08:32
回答 1查看 132关注 0票数 0

我有一组随机的人,他们接受多项服务,并需要将他们按收到的服务进行分层。共有7项服务,每项服务都有一个配额,以代表整个服务。

MS Access数据库中有三个表。

tblQuota(ServiceType,NumberReq) --每个服务名称和配额的列表。

代码语言:javascript
复制
ServiceType    NumbersReq
Service1       446
Service2       426
Service3       458
Service4       446

tblUserService(UserID,ServiceType) --他们接收的用户和服务列表。多到多,每项服务都可以有很多人,每个人都可以得到很多服务。tblUser(UserID,地址等)-用户联系方式。

使用VBA或其他编程的最佳方法是将人分组。如果有人同时获得“稀有”服务和“普通”服务,我显然希望将它们添加到可供选择的人数较少的稀有服务中。只有一种服务的人很容易,剩下的我很难想出一个很好的排序算法。

我希望我说得有道理,我每年都会用不同的配额和人员来做这件事,所以如果我能解决这个问题,将来会节省很多时间。谢谢。

编辑:这是我正在使用的DB:http://db.tt/SwrOHOrd,一旦分配了一个人,它们就不能在其他地方使用。

EN

回答 1

Stack Overflow用户

发布于 2012-01-12 20:51:08

我想我终于明白你的要求了。我没有从最初的问题中了解到,你们正在为满意度调查寻找一批客户。下面是我尝试创建所需选择的算法。

我的SQL很生疏,所以我只是将Access表tbtUserService复制到Excel中。我按客户端和服务类型进行排序:

表1

代码语言:javascript
复制
CustomerID  ServiceType
25000005    Service 1 - Hostel and Community Residential
25000005    Service 2 - Therapy
25000010    Service 1 - Hostel and Community Residential
25000010    Service 2 - Day options
25000010    Service 2 - Therapy
25000011    Service 3 - LAC
   :           :

我将这些记录合并到每个客户端创建一行,并将服务类型重命名为A到G,以便:

表2

代码语言:javascript
复制
CustomerID  Services
25000005    AD
25000010    ACD
25000011    E
25000012    DE
25000022    AD
25000031    A
   :        :

我按Services对该列表进行排序,然后计算要给出的每个组合的数量:

表3

代码语言:javascript
复制
Services Number  Services Number  Services Number  Services Number
A         182    AB         24    ABC         9    ABCD       34  
ABCDE       8    ABCDEF      7    ABCDEFG     1    ABCDEG      6  
ABCDF       2    ABCDG       1    ABCE        5    ABCEF       4  
ABCEFG      2    ABCEG       5    ABCF        1    ABCG        2  
ABD        17    ABDE        7    ABDEF       3    ABE         9  
ABEF        3    ABEFG       4    ABF         2    AC        185  
ACD       217    ACDE       18    ACDEF       8    ACDEFG      6  
ACDEG       2    ACDF       44    ACDFG       1    ACDG        6  
ACE        92    ACEF       12    ACEFG       6    ACEG        5  
ACF         2    ACFG        2    ACG         3    AD        254  
ADE        12    ADEF        4    ADF         4    AE         43  
AEF         8    AEFG        3    AEG         4    AFG         6  
B         143    BC         71    BCD        11    BCDE       18  
BCDEF      13    BCDEFG     19    BCDEG      11    BCDF        1  
BCDG        5    BCE       163    BCEF       47    BCEFG      16  
BCEG       18    BCF         1    BCFG        2    BCG         1  
BD          8    BDE        60    BDEF       20    BDEFG       1  
BDEG        2    BDF         1    BE        260    BEF        34  
BEFG       16    BEG        13    BF          4    BFG         1  
BG          2    C          43    CD          3    CDE       143  
CDEF       69    CDEFG      44    CDEG       26    CDF         3  
CE        489    CEF       177    CEFG       55    CEG        82  
CF          8    CG          1    D         111    DE       1726  
DEF       130    DEFG       28    DEG        13    DF          1  
E        5840    EF        312    EFG        40    EG         38  
F          17    FG          2  

下一个目标是确定每个组合中必须选择多少个才能达到配额。

从Access表tblProportions加载了所需的配额:

初始表4

代码语言:javascript
复制
Service Type  Numbers Req
A              446
B              426
C              458
D              446
E             1290
F              452
G              452

在构建前面的一个表时,我计算了每个服务的总使用数,并将结果添加到表4中,以便给出:

代码语言:javascript
复制
Service Type  Numbers Req  Total uses
A              446          1285
B              426          1118
C              458          2236
D              446          3129
E             1290         10210
F              452          1197
G              452           501

我添加了第四列“比率”,并按该列进行排序。

最终表4

代码语言:javascript
复制
Service Type  Numbers Req  Total uses  Ratio
G              452           501       0.902195609
B              426          1118       0.381037567
F              452          1197       0.377610693
A              446          1285       0.347081712
C              458          2236       0.204830054
D              446          3129       0.142537552
E             1290         10210       0.126346719

可以看到,90%的G服务客户必须经过挑选才能达到G的配额。因此,G的定额必须在B,F,等等之前考虑。

在表3(跨和向下读取)中,包括服务G在内的第一个条目是ABCDEFG,其中有一个事件被选为对G配额的贡献。但这也是对A、B、C、D、E和F的配额的贡献。

通过考虑服务B,更好地展示了选择过程的全部复杂性。包括B在内的第一项是AB,其中出现了24次。B服务的比例为38%,因此我们选择其中8项作为对B配额的贡献。这也是对A的配额的贡献8,但其他16次事件不能供选择,因为这将导致B的配额被超过。这就是说,我们选择了8个客户,对A的配额为446,但也减少了客户的数目可以贡献A配额从1285减少了24个。因此,在每一项选择中,我们都必须保持选定的总数,并且仍然可供选择。

每项服务的配额可通过下列选择来满足:

表5

代码语言:javascript
复制
Services Slct'd  Services Slct'd  Services Slct'd  Services Slct'd
A          58    AB          8    ABC         3    ABCD       11  
ABCDE       2    ABCDEF      2    ABCDEFG     1    ABCDEG      5  
ABCDF       1    ABCDG       1    ABCE        2    ABCEF       1  
ABCEFG      2    ABCEG       5    ABCF        1    ABCG        2  
ABD         5    ABDE        2    ABDEF       1    ABE         3  
ABEF        1    ABEFG       4    ABF         1    AC          0  
ACD         0    ACDE        0    ACDEF       2    ACDEFG      5  
ACDEG       2    ACDF       10    ACDFG       1    ACDG        5  
ACE         0    ACEF        3    ACEFG       5    ACEG        5  
ACF         1    ACFG        2    ACG         3    AD        157  
ADE         0    ADEF        1    ADF         1    AE        107  
AEF         2    AEFG        3    AEG         4    AFG         5  
B          44    BC         22    BCD         3    BCDE        6  
BCDEF       4    BCDEFG     17    BCDEG      10    BCDF        1  
BCDG        4    BCE        51    BCEF       15    BCEFG      14  
BCEG       16    BCF         1    BCFG        2    BCG         1  
BD          2    BDE        19    BDEF        6    BDEFG       1  
BDEG        2    BDF         1    BE         79    BEF        11  
BEFG       14    BEG        12    BF          1    BFG         1  
BG          2    C           0    CD          0    CDE         0  
CDEF       15    CDEFG      40    CDEG       23    CDF         1  
CE          0    CEF         5    CEFG       49    CEG        74  
CF          0    CG          1    D           0    DE          0  
DEF        38    DEFG       25    DEG        12    DF          1  
E         402    EF         90    EFG        36    EG         34  
F           5    FG          2  

这个表中有许多零。例如,没有选择ACs、ACDs或ACDs,因为服务C的配额是通过满足G、B和F的配额来达到的,也许应该有第一关选择每种组合中的一种。

最后阶段将是从表2的182中选择表5中的58,这将通过选择大约三分之一的A来实现。

标准名称与算法使用的名称之间的关系应该在前面列出,但如表6所示。

代码语言:javascript
复制
A   Service 1 - Hostel and Community Residential
B   Service 1 - Supported Community Living
C   Service 2 - Day options
D   Service 2 - Therapy
E   Service 3 - LAC
F   Service 4 - Family support
G   Service 4 - Respite

用于创建这些结果的代码需要稍微整理一下,但如果有用的话,我可以将它添加到这个答案中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8800225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档