Google 表格公式中 FILTER 内的 COUNTIF

问题描述 投票:0回答:2

我正在尝试为我的数据创建一个搜索表,其中有四列可以包含任何顺序的值,并且都是可选的。例如:

姓名 性别 值1 值2 值3 价值4
爱丽丝 F A
鲍勃 M A B C
查理 F C Z
查理 M B D A

我目前的搜索选项是姓名、性别和价值观。除名称外,所有内容都是可选的。我目前已经使用以下公式实现了姓名、性别和第一个值:

=FILTER(
  Data!D2:L,
  Data!D2:D = $B$1,
  IF(
    NOT(ISBLANK($D$1)),
    Data!E2:E = $D$1,
    Data!E2:E <> $D$1
  ),
  IF(
    NOT(ISBLANK($F$1)),
    (Data!I2:I = $F$1) + (Data!J2:J = $F$1) + (Data!K2:K = $F$1) + (Data!L2:L = $F$1),
    Data!D2:D = $B$1
  )
)

对于其他上下文,我的姓名下拉列表位于

$B$1
中,性别下拉列表位于
$D$1
中,值的下拉列表位于字段
$F$1:$I$1
中。

我的过滤器当前可以工作,但是,我需要为每个值使用 IF 语句来首先查看它是否为空,然后加入每个可能的列的检查。最后,如果值 1 的下拉列表为空,我不能简单地返回

TRUE
,所以我必须使用我已经知道是 true 的检查。

这一切都很好,尽管我很想使用

COUNTIF
。将每列的单独检查替换为:

COUNTIF(Data!I2:L, $F$1) > 0

遗憾的是,这似乎不起作用,并且会抛出错误,“FILTER 的范围大小不匹配。预期行数:1999,列数:1。实际行数:1,列数:1。”

有什么办法可以解决这个问题吗?此外,是否有比为每个可能的空白字段设置 IF 更简单的方法来解决此问题?

为了一些额外的上下文,这是我添加第二个到第四个值后的完整公式:

=FILTER(
  Data!D2:L,
  Data!D2:D = $B$1,
  IF(
    NOT(ISBLANK($D$1)),
    Data!E2:E = $D$1,
    Data!E2:E <> $D$1
  ),
  IF(
    NOT(ISBLANK($F$1)),
    (Data!I2:I = $F$1) + (Data!J2:J = $F$1) + (Data!K2:K = $F$1) + (Data!L2:L = $F$1),
    Data!D2:D = $B$1
  ),
  IF(
    NOT(ISBLANK($G$1)),
    (Data!I2:I = $G$1) + (Data!J2:J = $G$1) + (Data!K2:K = $G$1) + (Data!L2:L = $G$1),
    Data!D2:D = $B$1
  ),
  IF(
    NOT(ISBLANK($H$1)),
    (Data!I2:I = $H$1) + (Data!J2:J = $H$1) + (Data!K2:K = $H$1) + (Data!L2:L = $H$1),
    Data!D2:D = $B$1
  ),
  IF(
    NOT(ISBLANK($I$1)),
    (Data!I2:I = $I$1) + (Data!J2:J = $I$1) + (Data!K2:K = $I$1) + (Data!L2:L = $I$1),
    Data!D2:D = $B$1
  )
)
google-sheets google-sheets-formula filtering countif
2个回答
0
投票

对于这样的问题,最好使用

QUERY
。这是一个例子:

=QUERY(A2:F,
   "where 0=0"&
    IF(B1="",," and A='"&B1&"'")&
    IF(D1="",," and B='"&D1&"'")&
    IF(F1="",," and C='"&F1&"'")&
    IF(G1="",," and D='"&G1&"'")&
    IF(H1="",," and E='"&H1&"'")&
    IF(I1="",," and F='"&I1&"'"))

您还可以定义一个自定义函数来避免所有这些重复:

=LET(F,LAMBDA(opt,col,IF(opt="",," and "&col&"='"&opt&"'")),
     QUERY(A2:F,
       "where 0=0"&
        F(B1,"A")&F(D1,"B")&F(F1,"C")&F(G1,"D")&F(H1,"E")&F(I1,"F")))

0
投票

这里对您已有的内容稍作修改

IF-ELSE
TRUE 检查:

=filter(Data!D2:L,(Data!D2:D=B1)*
                   (if(len(E1),Data!E2:E=E1,1))*
                   (if(len(F1),((Data!I2:I=F1)+(Data!J2:J=F1)+(Data!K2:K=F1)+(Data!L2:L=F1)),1))*
                   (if(len(G1),((Data!I2:I=G1)+(Data!J2:J=G1)+(Data!K2:K=G1)+(Data!L2:L=G1)),1))*
                   (if(len(H1),((Data!I2:I=H1)+(Data!J2:J=H1)+(Data!K2:K=H1)+(Data!L2:L=H1)),1))*
                   (if(len(I1),((Data!I2:I=I1)+(Data!J2:J=I1)+(Data!K2:K=I1)+(Data!L2:L=I1)),1)))
© www.soinside.com 2019 - 2024. All rights reserved.