我不知道该如何正确表达,但请耐心听我说完。假设我拥有一家公司,有 5 个客户欠我钱。因此,我雇用了 3 个代理人来帮我追讨这笔钱,并从追讨到的钱中抽取 20% 的佣金。我想根据欠款金额将这些客户平均或半平均地分配给 5 个代理人。
客户 1 欠我 1000
客户2欠我2000
客户3欠我3000
客户4欠我2000
客户5欠我4000
代理1将带走客户1,3(总金额为4k)
代理2将带走客户2,4(总金额为4k)
代理 3 将接收客户 5(总金额为 4k)
但是假设我有 20,000 个客户,他们有应付的全部和合理金额,我知道没有办法将其平均分配给代理商,但我们可以为给予每个代理商的资金设置一个限额。例如,如果总金额为 353,464.42,则每个代理商应该拿走大约 117,821,47。
如何得出一个公式来做到这一点?
答案1
想象一下,你正在尝试将一块巧克力薄片均匀地分给 3 个孩子。你将薄片掰成随机的碎片。你首先要分发最大的碎片,然后逐步平衡它们。
我会尝试在 Excel 中执行相同操作。将数字从大到小排序。然后添加“分配给”列并将公式添加到第 2 行(假设为标题行)
=MOD(ROW()-2,n)+1
其中 n 是存储桶或代理的数量。这将创建一个重复模式 1..n 1..n 1..n(例如 1 2 3 1 2 3 1 2 3),有效地将每一行分配给一个存储桶或代理编号。
* 如果行数(20000?)比 n(3?)大很多,并且异常值很少(没有单个大数字),那么这足以平衡数字。
您可以使用 SUMIF 计算每个存储桶或代理编号的总数,并检查它们是否足够平衡。
如果这些假设*不成立,您可能需要采取更直观的薄片共享方法,并根据当前最低累计总数分配数字。在排序列表中,为前 n 个数据行分配 1..n。然后在 B 列中为第 n+2 行(假设 A1 为“值”,B1 为“分配给”)
=LET(runtot, SUMIF($B$2:Bm, {1, 2, ... n}, $A$2:Am), MATCH(MIN(runtot), runtot, 0))
其中 m 被替换为 n+1 的值,静态数组实际上是从 1 到 n 写出的。如果您没有 Excel 365 和 LET 函数,只需使用最后的 MATCH 方程,并将 runtot 替换为 SUMIF 公式两次。如果您无论如何都要为各个存储桶累计总数添加额外的列,那么您也可以使用这些列,而不是在单个公式中再计算一次。