Excel - 小计,但仅在满足特定条件的情况下 (SUMIF/AVERAGEIF)

Excel - SUBTOTAL but only where particular criteria is met (SUMIF/AVERAGEIF)

编辑:文档设置为一系列仪表板。一些如果链接到许多图表的数据是在枢轴 tables 和一些只是常规 tables。因为图表太多,我使用一些用户选择按钮和字段来更改这些图表中显示的数据。 部分用户在office 2016中打开文件
我找到的所有解决方案要么限于 365,要么涉及创建新数据 tables 或我试图避免的列,因为这意味着相当多的返工。相反,我只是使用了一组嵌套的 IFS,并且最终会考虑将这些特定的枢轴更改为带有索引查找的常规 tables,以使实际数据位于多个列中。

我目前使用 SUBTOTAL 函数对一个范围内的一堆单元格求和、计数或取平均值。我以前是手动过滤范围,所以我只合计了我想要的行,但是现在需要能够同时查看多个条件。 即在下面的示例中,我之前手动过滤范围以仅包括“Apple”,但现在我需要能够同时分别对“Apple”、“Orange”、“Banana”进行总计。

图表中使用了小计字段,我有一个单元格 (F5),其中包含一个对应于 SUM、COUNT 或平均值(9、2 或 1)的数字,用于“摘要 table",它链接到工作簿中的其他功能,我仍然需要能够保留该功能。

我的 sheet 设置示例:

原始数据

Product Type Sales QTY Date
Apple 4 1/9/21
Orange 3 6/9/21
Banana 2 10/9/21
Apple 6 14/9/21
Orange 6 20/9/21
Apple 5 29/9/21

我要匹配的条件在摘要的第 1 列(产品类型)中 table。

基本上,我希望最终能够将数据显示为 Totals:

$F = 9

每行: SUBTOTAL($F,SalesQTY)

总结Table

Product Type Result (Sales Per Month)
Apple 15
Orange 9
Banana 2

平均值:

$F = 1

每行: SUBTOTAL($F,SalesQTY)

Product Type Result (Average QTY per Sale)
Apple 5
Orange 4.5
Banana 2

或作为 Count:

$F = 2

每行: SUBTOTAL($F,SalesQTY)

Product Type Result (# Sales Transactions)
Apple 2
Orange 2
Banana 1

有没有什么方法可以结合 SUMIF 和 SUBTOTAL,同时又能保留在平均值、总和和计数之间切换的能力?

这是在 excel 365 中创建动态摘要 table 的公式。如果您有任何早期版本的 excel,公式会有所不同,并且行必须手动添加或删除。我假设你的 table 叫做 Data_Table.

=LET(
    Column_Product, Data_Table[Product Type],
    Column_QTY, Data_Table[Estimated],
    Column_Date, Data_Table[Date]

    Column_Key, Column_Product,
    Column_Filter1, Column_QTY,
    Column_Filter2, Column_Date,
    
    List_Filter1, UNIQUE(Column_Product),
    List_Filter2, 1,

    Categories, SORT(UNIQUE(Column_Key)),
    Array_BoolKey, (TRANSPOSE(Column_Key)=Categories)+0,
    Mask1, TRANSPOSE(ISNUMBER(XMATCH(Column_Filter1,List_Filter1))),
    Mask2, TRANSPOSE(Column_Filter2>List_Filter2),

    Array_BoolMasked, Array_BoolKey*Mask1*Mask2,
    Masked_QTY, IFERROR(Array_BoolMasked*TRANSPOSE(Column_QTY),0),
    Masked_Date, IFERROR(Array_BoolMasked*TRANSPOSE(Column_Date),0),

    Array_Ones, SEQUENCE(COLUMNS(Array_BoolMasked),1,1,0),

    Months, DATEDIF(MIN(Column_Date),MAX(Column_Date),"M"),

    Body_Count, MMULT(Array_BoolMasked, Array_Ones),
    Body_Sum_QTY, MMULT(Masked_FtModeled, Array_Ones),
    Body_Average_PerSale, Body_Sum_QTY/Body_Count,
    Body_Sum_QTY_PerMo, MMULT(Masked_FtModeled, Array_Ones)/Months,

    Total_Count, IFERROR(SUM(Body_Count_Lines),"-"),
    Total_QTY_PerMo, IFERROR(SUM(Body_Sum_QTY)/Months,"-"),
    Total_Average_PerSale, IFERROR(SUM(Body_Sum_QTY)/Total_Count,"-"),

    Array_Seq, {1,2,3,4,5},
    Array_Header, CHOOSE(Array_Seq, "Product Type", "Sales Per Month", "Average QTY per Sale", "# Sales Transactions"),
    Array_Body, CHOOSE(Array_Seq, Categories, Body_Sum_QTY_PerMo,  Body_Average_PerSale, Body_Count),
    Array_Total, CHOOSE(Array_Seq,  "Total", Total_QTY_PerMo, Total_Average_PerSale,  Total_Count),

    Range1,Array_Header,
    Range2,Array_Body,
    Range3,Array_Total,
    Rows1,ROWS(Range1), Rows2,ROWS(Range2), Rows3,ROWS(Range3), Cols1,COLUMNS(Range1),
    RowIndex, SEQUENCE(Rows1 + Rows2 + Rows3), ColIndex,SEQUENCE(1, Cols1),
    RangeTable,IF(
        RowIndex<=Rows1,
        INDEX(Range1,RowIndex,ColIndex),
        IF(RowIndex<=Rows1+Rows2,
            INDEX(Range2,RowIndex-Rows1,ColIndex),
            INDEX(Range3,RowIndex-Rows1-Rows2,ColIndex)
    )),

    Return, RangeTable,
    Return
)

我写的是一般性的,因此您可以仅针对某些产品、最小数量、日期范围或其他条件添加过滤器。在上面,我设置了过滤器以传递所有内容。

使用的解决方案:

为了避免不得不重新处理 sheet 中依赖于此字段的许多其他表,并且当某些用户使用 excel 的旧(非 365)版本打开此文件时,我选择了一系列嵌套的 IF(CountIF、SumIF、AverageIF)语句。