【问题标题】:Count number of rows where specified value is found at least once计算至少找到一次指定值的行数
【发布时间】:2020-08-31 02:51:34
【问题描述】:

我有一个谷歌电子表格,我试图在其中计算至少一列中存在某个值的行数。包含数据的列数因行而异。

例如,让我们以下面的工作表为例:

https://docs.google.com/spreadsheets/d/1yUnYBsmjKIOF_PubYQ6G41fmIPcw_7hzkiQ6qMIoN64/edit?usp=sharing

每一行代表一个任务,通过添加额外的列来添加参与该项目的人员的数据。

我想计算每个人至少完成了多少任务。 (如果 A 人多次执行任务 A,它只会算作 1)。

我尝试过使用 COUNTIFS 或 COUNTUNIQUEIFS 等公式,但由于列数可能不同,我对此感到失望。

有什么想法可以做到这一点吗?

【问题讨论】:

  • 单个任务中使用的“员工/日期/工作时间”列块的最大数量是多少?
  • 没有具体的最大数量,但似乎最多在 10 左右。是否可以仅使用始终高于列数的任意数字?
  • 是的。那么 10 是不是比以往任何时候都需要的数字?
  • 是的,10 应该足够了。
  • 今天长途旅行。今晚我会尝试看看,如果到那时没有其他人提供解决方案。

标签: google-sheets google-sheets-query


【解决方案1】:

看看有没有帮助

=countif(ArrayFormula(mmult(N(Sheet1!E2:100=A1), transpose(column(Sheet1!E2:2)^0))), ">1")

【讨论】:

    【解决方案2】:

    请参阅添加的工作表“Erik 帮助”,单元格 A1,了解以下数组公式:

    =ArrayFormula(QUERY({{"Employee";UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))},{"Projects";COUNTIF({Sheet1!E2:E&Sheet1!H2:H&Sheet1!K2:K&Sheet1!N2:N&Sheet1!Q2:Q&Sheet1!T2:T&Sheet1!W2:W&Sheet1!Z2:Z&Sheet1!AC2:AC&Sheet1!AF2:AF},"*"&UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))&"*")}},"Select * Order By Col2 Desc"))
    

    我会在这里分解一些,如果需要更深入的学习,然后鼓励你进一步剖析它。

    显然,这是一个数组公式。在这种情况下,这意味着一个公式正在生成整个报告。

    最外层的 QUERY 只是将结果放在双花括号 {{ }} 中,按项目数量排序:QUERY( {{...}} ,"Select * Order By Col2 Desc")

    您会看到那些双花括号。但实际上,它是一组外部大括号,其中包含另外两组大括号: { {...},{...} } 内部的两个数组分别创建报告的第一列和第二列。逗号表示将它们并排放置。您会注意到,每个内部数组的第一个元素都会为各个列(即“Employee”和“Projects”)生成标题。

    每个标题后面的分号表示将后面的内容放在下面,而不是并排放置。你会注意到第一个内部数组中有很多分号。因为你说在任何一个项目上工作的人永远不会超过 10 人,所以我们可以预先确定所有可能包含名称的列,并用这些分号虚拟“堆叠”它们,形成一个长的虚拟列。当然,其中许多列将是空的,因为许多项目不会有完整的十个人的名字。所以这个名称的虚拟列被包装在它自己的查询中,它将清除空值:

    QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0)
    

    为此,我应用了 UNIQUE,它提供唯一名称的第一列列表(而不是每次出现名称时):

    UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))
    

    所以完整的 first 内部虚拟数组(形成最终报告的完整第一列)如下所示:

    {"Employee";UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))}
    

    第二个内部虚拟数组使用与号将分配给每个项目的所有名称​​加入到一个长字符串中。因此,例如,如果 Chris、John 和 Ryan 都参与了一个项目(其中一些人多次参与),他们的行(看不见的)连接可能如下所示:ChrisChrisJohnChrisRyanChris。

    我们在每个由此类连接组成的虚拟数组上运行一个 COUNTIF,您将看到的条件主要由第一个内部虚拟数组中的整个 UNIQUE 子句组成(这是所有可能名称的候选名单)。您会注意到它的前后都附加了这样的星号: ""&UNIQUE(...)&"" 星号是任意数量字符的通配符。所以本质上这将搜索那些长连接的字符串以查找每个名称 anywhere 的外观;并且一旦找到一个名称,COUNTIF 就会将其注册为 TRUE...一次(不是每次出现在字符串中)。

    所以第二个内部虚拟数组孤立地看起来像这样:

    {"Projects";COUNTIF({Sheet1!E2:E&Sheet1!H2:H&Sheet1!K2:K&Sheet1!N2:N&Sheet1!Q2:Q&Sheet1!T2:T&Sheet1!W2:W&Sheet1!Z2:Z&Sheet1!AC2:AC&Sheet1!AF2:AF},"*"&UNIQUE(QUERY({Sheet1!E2:E;Sheet1!H2:H;Sheet1!K2:K;Sheet1!N2:N;Sheet1!Q2:Q;Sheet1!T2:T;Sheet1!W2:W;Sheet1!Z2:Z;Sheet1!AC2:AC;Sheet1!AF2:AF},"Select * Where Col1 Is Not Null",0))&"*")}
    

    如果没有我前面提到的最外层 QUERY,您仍然可以获得准确的结果;它们只会以 UNIQUE 名称列表碰巧出现在项目中的任何顺序显示。我觉得无论谁拥有最多的项目或最少的人,都可以发送更多订单。

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2011-07-28
      相关资源
      最近更新 更多