使用SUM和INDEX将公式转换为ARRAYFORMULA问题

时间:2019-07-25 14:42:30

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

我有一个正在进行的比赛的得分电子表格。根据相应值的图表,将竞争对手的位置/排名转换为整个系列的积分。对于平局,所有平局席位所涵盖的积分之和在平局竞争对手之间平均分配(例如,两局并列为三局;如果第三局通常获得10分,第四局通常获得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(),我可以生成平局值范围的开始和结束值,但不能生成完整列表。例如,如果有一个四分之三的平局,我可以分别产生第4和第6点(平局的边界)的点。 为了只列出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的样本点值,我期望两个并列第1的竞争对手的输出为925,并列第678的输出第三名,第六名603,第七名573,第八名550。

我将不胜感激!

1 个答案:

答案 0 :(得分:0)

=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))))

0