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)语句。
编辑:文档设置为一系列仪表板。一些如果链接到许多图表的数据是在枢轴 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)语句。