Я думаю, что наконец понял ваше требование. Из первоначального вопроса я не оценил, что вы искали выбор клиентов для опросов об удовлетворенности. Ниже приведен мой пример алгоритма создания требуемого выделения.
Мой SQL ржавый, поэтому я просто скопировал таблицу доступа tbtUserService в Excel. Я отсортировал по типу клиента и сервиса, чтобы дать:
Таблица 1
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
CustomerID Services
25000005 AD
25000010 ACD
25000011 E
25000012 DE
25000022 AD
25000031 A
: :
Я отсортировал этот список по Службам, а затем посчитал количество каждой комбинации, чтобы дать:
Таблица 3
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
Следующая цель - определить, сколько из каждой из этих комбинаций должно быть выбрано для соответствия квотам.
Требуемые квоты были загружены из таблицы доступа tblProportions:
Исходная таблица 4
Service Type Numbers Req
A 446
B 426
C 458
D 446
E 1290
F 452
G 452
При построении одной из предыдущих таблиц я рассчитал общее количество использований каждого сервиса и добавил результаты в таблицу 4, чтобы получить:
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
Я добавил четвертый столбец, Ratio, и отсортировал по этому столбцу.
Финальный стол 4
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, в которой есть 1 вхождение, которое выбрано в качестве вклада в квоту G. Но это также вклад в квоты A, B, C, D, E и F.
Полная сложность процесса выбора лучше демонстрируется при рассмотрении услуги B. Первая запись, включающая B, - это AB, из которых имеется 24 вхождения. Коэффициент обслуживания B составляет 38%, поэтому мы выбираем 8 из них в качестве вклада в квоту B. Это также вклад 8 в квоту А, но остальные 16 вхождений недоступны для выбора, поскольку это может привести к превышению квоты Б. То есть мы выбрали 8 клиентов с учетом квоты А в 446, но также сократили число клиентов, которые могли бы внести свою долю в квоту А, на 24 из 1285. Таким образом, при каждом выборе мы должны поддерживать итоги выбранных и все еще доступных для выбора. 1047 *
Квоты для каждой услуги могут быть удовлетворены следующими вариантами:
Таблица 5
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
В этой таблице есть несколько нулей. Например, AC, ACD или ACDE не были выбраны, потому что квота для службы C была удовлетворена путем удовлетворения квот для G, B и F. Возможно, должен был быть первый проход, который выбрал одну из каждой комбинации.
Завершающим этапом будет выбор 58 Как в Таблице 5 из 182 в Таблице 2. Это будет достигнуто путем выбора примерно каждого третьего A.
Связь между стандартными именами и теми, которые используются для алгоритма, возможно, должна была быть указана ранее, но показана в таблице 6.
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
Код, использованный для создания этих результатов, потребует небольшой корректировки, но я мог бы добавить его к этому ответу, если это будет полезно.