使用 excel 公式或幂查询将主表中的小时数分配到参考表中的所有匹配值

Posted

技术标签:

【中文标题】使用 excel 公式或幂查询将主表中的小时数分配到参考表中的所有匹配值【英文标题】:Distributing the hours from master table to all the matching values in reference table using excel formula or power queries 【发布时间】:2021-09-22 08:13:54 【问题描述】:

我的主表包含以下数据

RESOURCE NAME SKILL GROUP PROJECT COST PER HOUR CAPACITY
Resource 1 Automation Testing Project 1 12.0 800.0
Resource 2 DB Testing Project 1 11.0 900.0
Resource 3 DB Testing Project 1 12.0 800.0
Resource 4 Report Testing Project 2 12.0 200.0
Resource 5 CICD and Devops Project 3 11.0 800.0
Resource 6 Performance Testing Project 1 12.0 900.0
Resource 7 Automation Testing Project 2 10.0 250.0
Resource 8 Cloud Testing Project 3 12.0 900.0
Resource 9 Report Testing Project 1 11.0 800.0
Resource 10 Cloud Testing Project 1 11.0 900.0
Resource 11 Report Testing Project 3 12.0 800.0

我的参考资料表有这些条目

RESOURCE NAME SKILL GROUP PROJECT DEMAND Capacity
Resource 1 Automation Testing Project 2 900.0
Resource 2 DB Testing Project 1 300.0
Resource 3 DB Testing Project 1 400.0
Resource 1 Report Testing Project 1 200.0
Resource 4 CICD and Devops Project 3 300.0
Resource 5 Performance Testing Project 2 900.0
Resource 6 Automation Testing Project 1 200.0
Resource 2 Cloud Testing Project 2 900.0
Resource 7 Report Testing Project 1 400.0
Resource 8 Cloud Testing Project 3 800.0
Resource 9 Report Testing Project 2 900.0
Resource 10 Pipeline Testing Project 1 600.0
Resource 11 Cloud Testing Project 3 700.0
Resource 10 Performance Testing Project 2 900.0
Resource 11 Automation Testing Project 1 250.0

我在这里尝试实现的是将主表中给定的容量小时分配给参考表中的所有匹配记录。

例如: 在资源 10 的主表中,总容量为 900 小时,并且他已被分配到参考表中的 2 个不同项目,因此参考表中的他的容量列将被更新,总容量应分配到每个 450,如果他得到分配了更多的项目,那么他的总容量将分配给与资源 10 匹配的所有条目。其他匹配的资源也是如此。

【问题讨论】:

【参考方案1】:

在 Excel 365 中:

=XLOOKUP([@[Resource Name]],MasterTable[Resource Name],MasterTable[Capacity])/COUNTIF([Resource Name],[@[Resource Name]])

前几个条目。


我不确定这是否真的是您想要的,但这是一个示例,其中调整了最后一个条目以使同一资源的所有条目精确到小数点后一位

=LET(totcap,XLOOKUP([@[Resource Name]],MasterTable[Resource Name],MasterTable[Capacity]),
count,COUNTIF([Resource Name],[@[Resource Name]]),
roundcap,ROUND(totcap/count,1),
IF(ROW()<MAX(IF([@[Resource Name]]=[Resource Name],ROW([Resource Name]))),roundcap,totcap-roundcap*(count-1)))

这是没有 let 的公式 - 太可怕了:

=IF(ROW()<MAX(IF([@[Resource Name]]=[Resource Name],ROW([Resource Name]))),ROUND(XLOOKUP([@[Resource Name]],MasterTable[Resource Name],MasterTable[Capacity])/COUNTIF([Resource Name],[@[Resource Name]]),1),XLOOKUP([@[Resource Name]],MasterTable[Resource Name],MasterTable[Capacity])-ROUND(XLOOKUP([@[Resource Name]],MasterTable[Resource Name],MasterTable[Capacity])/COUNTIF([Resource Name],[@[Resource Name]]),1)*(COUNTIF([Resource Name],[@[Resource Name]])-1))

【讨论】:

谢谢汤姆,它工作正常,直到结果不是十进制的,我想与分配的小时数与总容量进行精确匹配。例如,如果我们添加 3 条记录,那么它会产生十进制值。 你的意思是,如果资源 1 有三个条目,那么你会得到 266.666...?您可以将其显示为 266.7 的小数点后一位,但是显示的三个数字加起来会是 800.1 而不是 800? 是的,我指的完全一样,我该如何处理这种情况,因为根据这个(小时),我的成本将被计算出来,实际情况会有所不同 所以只是检查一下,在这种情况下,您希望容量为 266.7、266.7 和 266.6 吗?可以做到,但要复杂得多。 我开始使用此解决方案收到#NAME? 错误。给出的范围是否正确?【参考方案2】:

看看这是否适合你,在 powerquery 中

加载主表作为查询。文件 .. 关闭并加载以 ... 仅创建连接。将其命名为 MasterTable

将参考表(没有容量列)加载到 powerquery 右键单击资源名称,分组依据,[x] 高级 对于第一行,使用操作计数行 对于第二行,使用操作所有行

使用已创建的新列顶部的箭头展开数据

MasterTable 合并到这个左外连接中,使用 Resource Name 列进行匹配

使用已创建的新列顶部的箭头展开容量列

添加列...自定义列..将容量除以计数。删除多余的列

let Source = Excel.CurrentWorkbook()[Name="Table2"][Content],
#"Changed Type" = Table.TransformColumnTypes(Source,"RESOURCE NAME", type text, "SKILL GROUP", type text, "PROJECT", type text, "DEMAND", Int64.Type),
#"Grouped Rows" = Table.Group(#"Changed Type", "RESOURCE NAME", "Count", each Table.RowCount(_), type number, "Data", each _, type table),
#"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", "SKILL GROUP", "PROJECT", "DEMAND", "SKILL GROUP", "PROJECT", "DEMAND"),
#"Merged Queries" = Table.NestedJoin(#"Expanded Data","RESOURCE NAME",MasterTable,"RESOURCE NAME","MasterTable",JoinKind.LeftOuter),
#"Expanded MasterTable" = Table.ExpandTableColumn(#"Merged Queries", "MasterTable", "CAPACITY", "FULLCAPACITY"),
#"Added Custom" = Table.AddColumn(#"Expanded MasterTable", "Capacity", each [FULLCAPACITY]/[Count]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom","Count", "FULLCAPACITY")
in #"Removed Columns"

输入略有不同的输出以显示小数

【讨论】:

能否请您详细说明这些行,无法理解 使用列顶部的箭头展开数据 - //我没有看到此选项,我可以三列(资源名称、计数和数据)将另一个表合并到这个表中,左外连接,使用资源名称列匹配 - // 你的意思是主表和引用表是哪个表?展开容量列-//你的意思是在主表中?添加将容量除以计数的自定义列。 //所以上面给出的代码将被使用? 按说明加载第一个表。加载第二个表的数据。使用 home ... advanced 并粘贴到我的代码中,用你的替换我的 let source 行。然后只需一步步执行代码并查看步骤的结果

以上是关于使用 excel 公式或幂查询将主表中的小时数分配到参考表中的所有匹配值的主要内容,如果未能解决你的问题,请参考以下文章

按小时计算行数并包含零

oracle查询包含在子表中的主表数据

将 Excel 工作表中的数据插入到链接的访问表中

Excel VBA 评估另一张工作表中的公式

使用 Visual Basic SQL 查询的 Excel 在记录更改时删除公式

excel问题,将两个表中的数量合计到另外一个表中,公式是怎样的??