在Excel中,我有一个表,其中包含多组项目中不同项目的历史价值数据。当输入新项目的记录时,必须放弃该项目的旧值,并且必须根据新项目的值重新计算组中项目的总价值。在每个组中,根据指定的组名称和日期,仅包含每个项目的最后一条记录;每个项目的最后日期都小于指定日期。我想根据组名称和特定日期查找每个组中项目值的总和,我该怎么做?
如图所示,数据分为两组,G1 和 G2,...在每一行中,我需要计算截至该日期已输入的相应组中项目的总价值。在表格的右侧,我根据“日期”和“组”字段过滤了所需的记录,然后输出将是绿框中显示的值的总和。 在日期 D3,作为项目 i11 输入的新值,根据该新值重新计算组总计值。同样在表格中,每行中每个组的总值显示在[组总和]列中,最后两列也通过公式显示。
数据:
行 | 团体 | 项目 | 日期 | 价值 | 组的总和 |
---|---|---|---|---|---|
1 | G1 | i11 | D1 | 10 | 30 |
2 | G1 | i12 | D1 | 20 | 30 |
3 | G1 | i13 | D2 | 30 | 60 |
4 | G1 | i11 | D3 | 40 | 90 |
5 | G1 | i14 | D4 | 50 | 140 |
6 | G1 | i13 | D5 | 60 | 170 |
7 | G1 | i13 | D6 | 70 | 190 |
8 | G1 | i13 | D6 | 80 | 190 |
9 | G1 | i12 | D7 | 90 | 260 |
10 | G1 | i14 | D8 | 100 | 310 |
11 | G2 | i21 | D8 | 110 | 110 |
12 | G1 | i13 | D9 | 120 | 350 |
13 | G2 | i22 | D9 | 130 | 270 |
14 | G2 | i21 | D9 | 140 | 270 |
您标记了 Excel 2010。
我设法在 Office 365 中找到解决方案:
=LET(f,FILTER(HSTACK([Item],ROW([Item])-1),([Group]=[@Group])*([Date]<=[@Date])),
i,TAKE(f,,1),
r,DROP(f,,1),
SUM(INDEX([Value],FILTER(r,MMULT((TOROW(i)=i)*(TOROW(r)>=r),SEQUENCE(ROWS(f))^0)=1))))
该公式首先过滤同一组、相同日期或更小的所有项目
i
- 连同其行引用(负 1),因为表格从第 2 行开始,即第一行,因此 ROW(2)-1
= 1 ) r
。
MMULT 用于检查过滤结果中是否存在重复项。仅最后找到的
i
项目返回为 TRUE。
这用作 FILTER 条件,以删除先前的重复项并仅返回最后找到的
i
值的行号。
这些行号用于 INDEXed
Item
列,并且这些返回值经过求和。
或者当您使用 Beta Chanel Insiders 时:
=LET(f,FILTER(HSTACK(Table2[Item],ROW(Table2[Item])),(Table2[Group]=Table2[@Group])*(Table2[Date]<=Table2[@Date])),SUM(INDEX(E:E,DROP(GROUPBY(TAKE(f,,1),DROP(f,,1),MAX,,0),,1))))