【问题标题】:Converting formula to ARRAYFORMULA issues with SUM and INDEX使用 SUM 和 INDEX 将公式转换为 ARRAYFORMULA 问题
【发布时间】:2019-07-25 14:42:30
【问题描述】:

我有一个我正在进行的比赛的评分电子表格。根据相应值的图表,将竞争对手的位置/排名转换为整个系列的积分。对于平局,所有并列名额的积分总和平均分配给并列的参赛者(即 2 路并列获得第 3 名;如果第 3 名通常获得 10 分,而第 4 名通常获得 8 分,则这些参赛者将获得(10+ 8)/2(2 是并列参赛者的数量),因此他们每人获得 9 分)。 我有一个公式可以进行精确计算:

=IFERROR(IF(ISBLANK($A4:$A),,SUM(INDEX(SeriesPoints, E4:E):INDEX(SeriesPoints, MIN(E4:E + COUNTIF(E$4:E, E4:E) - 1, ROWS(SeriesPoints)))) / COUNTIF(E$4:E, E4:E), 0))

其中 'SeriesPoints' 是一个 2 列数组;第 1 列是位置/等级 (1:125),第 2 列是它们对应的点值。 “E”列是参赛者在比赛中的排名。

我无法将此公式转换为 ARRAYFORMULA(),因此我可以避免将其拖到整个工作表中(在该系列中可能多达 1000 多个竞争对手)。 我对 MMULT() 有一定的了解,所以我知道这将是切换 SUM() 的好方法,但是,我无法创建要求和的值的矩阵。 INDEX():INDEX() 不适用于 ARRAYFORMULA(),所以我尝试切换到 VLOOKUP()。使用 VLOOKUP() 我已经能够生成平局值范围的开始值和结束值,但不能生成完整列表。例如,如果 4th 有 3-way tie,我可以为 4th 和 6th 生成相应的点(平局的界限)。 为了尝试仅列出 4:6 中的数字,我已经将简单的 ROW() 或 SEQUENCE() 公式转换为矩阵/数组。

下面的公式会生成一个包含平局上限和下限的数组,或者如果没有平局,则生成单个位置,尽管单个位置会重复。

=ARRAYFORMULA(IF(COUNTIF(E$4:E,E4:E)=1,E4:E,{E4:E,E4:E+COUNTIF(E$4:E,E4:E)-1}))

我假设如果我可以让 VLOOKUP({#:#}) 正确填写,我将在我需要的地方。 从这里开始,我对自己的能力充满信心,可以将 VLOOKUP() 包装为实际点值,将 MMULT() 对这些行求和以获得总计,然后进行简单的除法以产生正确的点值。

电子表格:https://docs.google.com/spreadsheets/d/1lpNewR3p4i7ZHmlFGLlG1tLuxgO-6onSeH8mWTeclBw/edit?usp=sharing 目前,我的工作区在右边。原始公式在 F4 中,我的测试代码在 G 列而不是 E 列上工作。

因此,对于 1,1,3,3,3,6,7,8 的样本位置和 1000、850,738,663,633,603,573,550 的样本点值,我预计两个并列第一的竞争对手的输出为 925,并列的竞争对手为 678第 3 名,第 6 名 603 名,第 7 名 573 名,第 8 名 550 名。

我将不胜感激!

【问题讨论】:

  • 不确定您的半空工作表中发生了什么...您可以在工作表中添加所需输出的示例吗?
  • @player0 添加了所需的输出,并删除了一些空列。这张表是复制原件以隐藏一些个人数据,抱歉有点乱。

标签: google-sheets google-sheets-formula array-formulas google-sheets-query gs-vlookup


【解决方案1】:
=ARRAYFORMULA(IFERROR(IFERROR(VLOOKUP(G4:G, QUERY({INDIRECT("G4:G"&counta(A4:A)+3), 
 VLOOKUP(ROW(INDIRECT("A1:A"&COUNTA(A4:A))), SeriesPoints, 2, 0)}, 
 "select Col1,sum(Col2) group by Col1 label sum(Col2)''", 0), 2, 0))/
 IFERROR(VLOOKUP(G4:G, QUERY(G4:G, 
 "select G,count(G) where G is not NULL group by G label count(G)''", 0), 2, 0))))

【讨论】:

  • 如果竞争对手没有按地点/排名排序,这似乎不起作用。是否有可以解决此问题的公式的修复程序,我不想重新格式化将竞争对手添加到工作表的方式。
  • @JoshLowy =ARRAYFORMULA(IFERROR(IFERROR(VLOOKUP(G4:G, QUERY({SORT(INDIRECT("G4:G"&counta(A4:A)+3)), VLOOKUP(ROW(INDIRECT("A1:A"&COUNTA(A4:A))), SeriesPoints, 2, 0)}, "select Col1,sum(Col2) group by Col1 label sum(Col2)''", 0), 2, 0))/ IFERROR(VLOOKUP(G4:G, QUERY(SORT(G4:G), "select Col1,count(Col1) where Col1 is not NULL group by Col1 label count(Col1)''", 0), 2, 0))))
  • 像魅力一样工作!非常感谢@player0 !!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2022-11-27
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多