【问题标题】:Average of four dates with multiple criteria具有多个条件的四个日期的平均值
【发布时间】:2019-04-11 05:14:53
【问题描述】:

我有两张 Excel 表格。表 1 有以下记录:

Salon          coach       date         amount
Sal1           col1       11/7/2018     500
Sal1           col1       11/1/2018     400
Sal1           col1       10/25/2018    600
Sal1           col1       10/19/2018    700
Sal1           col1       10/1/2018     250
And so on

表 2 具有以下列和记录:

Salon         coach       average of lastest 4 dates
Sal1          col1                       ???

我想找出四个最近日期的平均金额,不包括最近的日期。计算应从最晚 2 日到最晚 5 日开始,并符合标准沙龙和教练。

【问题讨论】:

  • 感谢您的编辑
  • 那些日期,它们的顺序是随机的吗?或者我们可以假设它是从顶行开始往下倒的时间顺序?
  • 感谢您的回复。这些可以是随机的,也可以是按时间顺序的
  • 如果需要按时间顺序,我可以将这些日期从最新到最旧排序
  • 您确定每个沙龙总是有至少 4 个日期吗?

标签: excel vba function excel-formula


【解决方案1】:

最终版本(灵活的日期参数和定义的名称)

使用数组函数(因此您必须使用 ctrl+shift+enter 输入),并使用命名范围以使公式更易于理解:

{=AVERAGE(IF(
     (r_salon=A14)*
     (r_coach=B14)*
     (r_date>=LARGE(IF((r_salon=A14)*(r_coach=B14);r_date;);
                    MIN(d_last;COUNTIFS(r_salon;A14;r_coach;B14))))*
     (r_date<=LARGE(IF((r_salon=A14)*(r_coach=B14);r_date;);
                    MIN(d_first;COUNTIFS(r_salon;A14;r_coach;B14))));
      r_amount))} 

为了进行测试,我将公式与数据放在同一张纸上,因此 Sal1 位于单元格 A14 中,而 col1 位于单元格 B14 中。

公式说明(以便您可以根据需要进行微调):

  • 两个内部IF为Sal1和col1(单元格A14和B14)创建一个包含所有日期的数组,它周围的LARGE函数取第n个最大值; n 实际上分别计算为 d_first 或 d_last 的最小值和 Sal1/col1 组合实际存在的日期/行数(这将处理某些情况沙龙/教练组合可能少于d_first 或d_last 日期;
  • 外部IF 然后创建一个包含所有满足所有条件的所有日期的数组,即d_first 之后的 Sal1 AND col1 AND 在d_last 之前(用上一步中的内部IF 计算); * 是 AND 运算符的简写,它也适用于数组公式(AND 不适用);
  • AVERAGE 当然是微不足道的。

为了使公式更灵活,我使用了两个参数(定义名称):d_first 是您要包含的最近日期,d_last 是您要包含的最后日期。一些例子:

  • d_first=2 和 d_last=5 :回答您的实际(更新)问题,即 4 个日期的平均值,从最近的第 2 天到最近的第 5 天;
  • d_first=1 和 d_last=4 :这与答案的第一个版本相同,即结果将是最近 4 个日期的平均值;
  • d_first=2 和 d_last=4 :这将是最近 2 日到 4 日的平均值;
  • d_first=1 和 d_last=1 :这只会产生最近的日期(一个值的平均值就是值本身)。

您只需确保d_first 是一个正整数(大于零),并且d_last 必须大于或等于d_first。如果它们大于数据集中的日期总数,则结果是与最早日期对应的值。

您还必须考虑如果同一日期有多个条目会发生什么。当前公式适用于截止日期(最早和最新),而不适用于实际平均的记录数((如果您有多个记录在截止日期内具有相同的日期,所有这些都将用于平均值的计算)。

第 2 版(增加更多灵活性)

公式:

{=AVERAGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14)*($C$2:$C$11&gt;=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(d_last;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))))*($C$2:$C$11&lt;=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(d_first;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))));$D$2:$D$11))}

版本 1(原始问题,即最近 4 个日期的平均值;这不相关,因为问题已更新)

您可以使用以下数组公式完成此操作(因此您必须使用 ctrl+shift+enter 输入):

{=AVERAGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14)*($C$2:$C$11&gt;=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(4;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))));$D$2:$D$11))}

注意
(仅供参考,如果您使用 F9 调试公式并检查各种数组中间结果)
数组不仅包含满足条件的值,而且与IF 的参数大小相同(即,值与数据集中的行数一样多),并用FALSE 用于与条件不匹配的行。由于AVERAGE 函数(与许多其他函数一样)没有考虑FALSE 值,因此这对结果没有影响,因此我没有使公式过于复杂以仅保留数组中的匹配日期。

【讨论】:

  • 很抱歉,但它不适用于多个沙龙/教练组合,这与我的第一个解决方案错误的原因相同。您必须为每个组合创建单独的日期数组。
  • @MichalRosa 您是否测试过公式,如果测试过,结果有什么问题?使用我的解决方案,数据数组是在公式中动态计算的,因此不需要单独创建。这个公式适用于所有可能的沙龙和教练组合,所以我不确定为什么它不适合你?
  • 我已经测试过了。请与多个沙龙和教练一起尝试一下 - 使用我的回答中显示的输入表。您必须分别检查每个沙龙/教练组合的日期。看一下屏幕截图 - drive.google.com/open?id=1iTftH_8nEeB7oD1ZzniMDYjiZek0wlsO - E 列中的值是手动计算的,I 列中的值来自我的公式,J 列中的值来自你的公式。干杯,米哈尔
  • 但我的公式仍在回答原始问题,即最近 4 个日期的平均值,我在您的回答下从@Dani 阅读了 cmets(以及您在回答的屏幕截图中写的内容)你计算“没有最后一个的前4个”?
  • 彼得,你的公式只有在沙龙/教练的组合只有一种时才有效,如果有更多,它就会失败。就是这么简单。它回答了提出的原始问题,但没有回答后面提出的扩展问题。请自己检查。干杯,米哈尔
【解决方案2】:

嗯,这个应该可以的。我希望我已经针对所有可能的情况进行了测试。

 =SUMPRODUCT(
 (Table1[Salon]=G5)*(Table1[coach]=H5)*
 (Table1[date]>=LARGE(((Table1[Salon]=G5)*(Table1[coach]=H5)*(Table1[date])),5))*
 (Table1[date]<=LARGE(((Table1[Salon]=G5)*(Table1[coach]=H5)*(Table1[date])),2))*
 Table1[amount])/4

让我知道它是如何为你工作的。

干杯,

【讨论】:

  • 谢谢 michal,如果我想从第二个最新日期开始到 4,我也可以有解决方案吗?
  • 欢迎。 =SUMPRODUCT((salon=F2)*(coach=G2)*(date>=LARGE(date,4))*(date
  • 这背后的主要目的是我想计算最新日期的数量与前 4 个最新日期的平均值之间的变化百分比,这就是为什么我需要 4 个最新日期的平均数量,不包括最新日期日期。
  • 只需根据需要更改 date>=LARGE(date,4) 和 (date
  • 是的,我有更改,但是当我使用范围时,这给了我正确的值,而当我使用表格列时,它没有给我正确的值。请看下面我的公式:=SUMPRODUCT((SalonInput[Salon]='Per Change'!A2)*(SalonInput[Coach]='Per Change'!B2)*(SalonInput[Week Ending]>=LARGE(SalonInput[Week Ending],5))*(SalonInput[Week Ending]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2021-08-12
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
相关资源
最近更新 更多