【问题标题】:filtering two columns into one picking one or the other according to some condition根据某些条件将两列过滤为一列
【发布时间】:2018-08-02 03:55:11
【问题描述】:

我正在尝试在 Google 表格中创建一个过滤器,该过滤器将从两列之一中选择值,具体取决于该行中另一列的值。我发现了几个似乎在问类似问题的问题,但我没有关注如何扩展这个想法。

下面的测试表显示了我想要完成的任务:

左半部分显示输入数据,右半部分(从 G 列开始)显示我要完成的任务。

我正在过滤 H1。我想要在 B 列或 C 列中包含 H1 值的每一行。如果它出现在 B 列中,那么我还想要相应 D 单元格的值,而如果它出现在 C 列中,我想要相应的值E 细胞。我们可以假设它永远不会出现在 B 列和 C 列中。

我可以在 G3 中使用这个公式创建 G3:I 范围:

=FILTER(A2:C,(B2:B = H1)+(C2:C = H1))

但我正在努力输入 J3 的公式。

我尝试了以下公式,但它只显示#VALUE!

=FILTER({D2:D,E2:E},{(B2:B = H1),(C2:C = H1)})

我的想法是D2:D, E2:E 会将两列并排堆叠,如果 B 单元格匹配 H1,我将使用第一列,如果 C 单元格匹配 H1,则使用第二列。

我试过这个公式:

=FILTER({D2:D,E2:E},{(B2:B = H1)+(C2:C = H1)})

但它显示了两列,我只想要一列或另一列,具体取决于 H1 中的值显示在该行的哪一列。

我也尝试过 QUERY,但它们似乎都有语法错误:

=QUERY({D2:D,E2:E},"SELECT (D*(B=H1))",0)
=QUERY({D2:D,E2:E},"SELECT (D*IF(B=H1,1,0))",0)

在这种情况下,我首先尝试通过将每列(D 和 E)乘以 1 或 0 来建立值,具体取决于那是我要查看的列,然后它们将两者相加。由于我只有数字,因此这种方法似乎可行。

我突然想到,我可能会使用 where 子句来只获取匹配其中一个或另一个的行:

=QUERY({B2:E},"SELECT Col3 WHERE Col1='"&H1&"'",0)

但这只会得到 B 匹配 H1 的行,我不确定如何将它与 C 匹配 H1 的行结合起来,并且仍然保持所有内容的正确顺序。

如果我匹配 B 列或 C 列匹配,我仍然不知道如何在一种情况下选择 Col3,在另一种情况下选择 Col4。这只会得到 Col3,这对于 #=4 是不正确的:

=QUERY({B2:E},"SELECT Col3 WHERE Col1='"&H1&"' OR Col2='"&H1&"'",0)

此外,QUERY 似乎要求所有数据都驻留在当前工作表中。在我的最终版本中,我需要获取另一张工作表的数据,所以看起来尝试使用 QUERY 已失效。

更新: 我可以创建三个单独的公式:

J3: =FILTER({D2:D,E2:E},{(B2:B = H1)+(C2:C = H1)})
L3: =FILTER(IF(B2:B=H1,1,0),{(B2:B = H1)+(C2:C = H1)})
M3: =FILTER(IF(C2:C=H1,1,0),{(B2:B = H1)+(C2:C = H1)})

然后工作表如下所示:

有什么方法可以将这些组合成 J3 中的一个公式,根据:

J3*L3 + K3*M3

【问题讨论】:

  • 为什么不使用简单的 if?

标签: google-sheets


【解决方案1】:

这似乎可以做到这一点:

=FILTER(IF(B2:B=H1,D2:D,E2:E),{(B2:B = H1)+(C2:C = H1)})

过滤器的第二个参数确保选择的行是 C 或 D 列与所选值匹配的行。

然后第一个参数选择返回的参数。

【讨论】:

    【解决方案2】:

    因此,如果水果是 H 列,则您想要找到 D 列的编号,如果水果在 I 中,则查找 E 列的编号。

    我从一个简单的 if 开始,但由于 H3:H=H1 只返回一次 false,我不得不添加一个数组公式

    =ARRAYFORMULA(IF(H3:H=H1;/* get the D value */;/* get the E value */))
    

    现在我只是使用你的公式来获得 D 和 E 值

    FILTER(D2:D;{(B2:B = H1)+(C2:C = H1)})
    FILTER(E2:E;{(B2:B = H1)+(C2:C = H1)})
    

    我将所有空行放在一起后出现错误,因此我添加了IFERROR

    =IFERROR(ARRAYFORMULA(IF(H3:H=H1;FILTER(D2:D;{(B2:B = H1)+(C2:C = H1)});FILTER(E2:E;{(B2:B = H1)+(C2:C = H1)})));"")
    

    【讨论】:

    • 谢谢!我根据您的建议找到了一个仅使用一个 FILTER 和一个 IF 呼叫的简化呼叫。
    • 由于某种原因,我无法让它与过滤器中的 if 一起工作,很高兴你能解决这个问题!
    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多