Excel -独特的组合

xe55xuns  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(125)

我有一个电子表格,看起来像这样:

Comp  Fund  Date       Value
A     X     30/09/2022 12
B     X     30/09/2022 15
E     X     30/09/2022 31
A     X     31/12/2022 10
B     X     31/12/2022 20
C     X     31/12/2022 15
D     Y     31/12/2022 22

我需要输出,使用公式(不是宏,也不是过滤器,也不是手动数据操作),所有的公司和基金的组合和价值,为一个预先确定的日期。如果没有这样的日期条目,则值应为零。
例如,对于所选日期31/12/2022(例如,在单元格F1中),输出应为

Comp  Fund  Value
E     X     0
A     X     10
B     X     20
C     X     15
D     Y     22

我尝试使用Comp和Fund的独特组合,但效果不理想。

7tofc5zh

7tofc5zh1#

您可以尝试使用HSTACK()BYROW()函数的组合,如下所示:

·单元格G4中使用的公式

=LET(α,SORT(UNIQUE(A2:B8)),σ,G2,
HSTACK(α,BYROW(α,LAMBDA(x,XLOOKUP(1,(TAKE(x,,1)=A2:A8)*(TAKE(x,,-1)=B2:B8)*(σ=C2:C8),D2:D8,0)))))

=LET(
α,A2:A8,
ß,B2:B8,
Δ,C2:C8,
Θ,D2:D8,
Φ,G2,
ε,SORT(UNIQUE(HSTACK(α,ß))),
VSTACK({"Comp","Fund","Value"},
HSTACK(ε,BYROW(ε,LAMBDA(x,
XLOOKUP(1,(TAKE(x,,1)=α)*(TAKE(x,,-1)=ß)*(Φ=Δ),Θ,0))))))

使用希腊字母的想法取自**Jos Woolley先生,我发现它看起来很酷,同时为计算结果和变量分配名称。

lzfw57am

lzfw57am2#

另一种选择是使用MMULT,因此不需要lambda迭代:

=LET(r,  A2:D8,
     v,  F1,
     a,  INDEX(r,,1), b,  INDEX(r,,2),  c,  INDEX(r,,3),  d,  INDEX(r,,4),
     ab, UNIQUE(TAKE(r,,2)),
     ua, TAKE(ab,,1),  ub, TAKE(ab,,-1),
     mm, MMULT((TOROW(a)=ua)*(TOROW(b)=ub)*(TOROW(c)=v),d),
HSTACK(ab,mm))

mm检查列A和B中的值是否等于这两列的唯一版本的值,并在列C中具有正确的日期值v。如果是,则对满足这些条件的列D的值求和。结果与列A和B的唯一值连接(堆叠):

  • 编辑:根据大卫Leal的建议,将最后一部分从HSTACK(ua,in,mm)改进为更短的HSTACK(ab,mm) *
5ssjco0h

5ssjco0h3#

这里是另一种方法,它假设对于给定的查找日期(lk),CompFund列值的唯一组合不超过一个,就像在问题的示例中一样。

=LET(lk,F1, data,A2:D8, abUx,UNIQUE(TAKE(data,,2)),
 VSTACK({"Comp","Fund","Value"}, HSTACK(abUx, BYROW(abUx, LAMBDA(x,
  FILTER(TAKE(data,,-1), (INDEX(data,,3)=lk)
   * (MMULT(N(TAKE(data,,2)=x),SEQUENCE(COLUMNS(abUx),,,0))=2),0))))))

注意:由于我们只考虑两列的唯一元素,因此您可以将SEQUENCE调用替换为:{1;1},如果你喜欢,可以得到一个更短的公式。

您可以避免使用MMULTFILTER添加附加条件,如下所示:

=LET(lk,F1, data,A2:D8, abUx,UNIQUE(TAKE(data,,2)),
 VSTACK({"Comp","Fund","Value"}, HSTACK(abUx, BYROW(abUx, LAMBDA(x,
  FILTER(TAKE(data,,-1), (INDEX(data,,3)=lk) * (INDEX(data,,1)=INDEX(x,1))
   * (INDEX(data,,2)=INDEX(x,2)),0))))))

下面是输出:

基本上在第一个公式中,它首先找到唯一的前两列(abUx),然后使用BYROW迭代abUx元素。在每次迭代中,我们使用FILTER来选择满足所有条件的值,即匹配唯一元素(x)加上查找日期(lk)的所有值。我们使用MMULT来匹配x的两个唯一值,因为它是一个与条件,我们等于2。如果过滤器输出为空,则返回0。剩下的就是使用HSTACKVSTACK来适应输出。

相关问题