在 Google 表格中整理/汇总特定数据的有效方法

Posted

技术标签:

【中文标题】在 Google 表格中整理/汇总特定数据的有效方法【英文标题】:Efficient way to collate/aggregate specific data in Google Sheets 【发布时间】:2021-12-20 21:44:04 【问题描述】:

我正在寻找一种在 Google 表格中收集和汇总某些日期的有效方法。我一直在查看查询函数、数据透视表和索引 + 匹配公式,但到目前为止,我还没有找到一种方法可以让我得到我正在寻找的结果。我有一组数据,大致如下。

带有 X 的字段代表不相关的数据,我不想在最终结果中显示这些数据。它们仅用于说明在我想要的数据列之间存在我不想要的数据列。这些列中的数据具有不同的类型和每种类型的不同值,它们实际上并不是其中带有“X”的字段。只有带有数字的字段以及它们顶部和左侧的相关名称是有意义的。目的是创建一个或多或少像这样的列表。

我已突出显示这些黄色字段,因为这些数据已被汇总。例如,在原始文件中,字段 D3 显示了 Laura 和 Pete 之间的关系,编号为 1,而字段 L3 也显示了 Laura 和 Pete 之间的关系,因此该字段中的数字将添加到另一个字段中的数字导致该特定组合的总和为 2。

如果有任何建议可以帮助我为此找到一个优雅而有效的解决方案,我将不胜感激。我能想出的唯一解决方案将涉及多个“中间”工作表,并且必须有更好的方法。

更新:

通过在 player0 的答案中应用解决方案来解决。我只需要在公式中切换 Col1 和 Col2 的顺序,就可以按照我需要的方式对表格进行排序。公式现在如下所示。非常感谢 player0 和 Erik Tyler 的努力。

=INDEX(QUERY(SPLIT(FLATTEN(A2:A&"×"&D1:N1&"×"&D2:N), "×"), 
 "select Col2,Col1,sum(Col3)
  where Col2 is not null 
    and Col3 is not null
  group by Col2,Col1
  label sum(Col3)''", ))

【问题讨论】:

你能分享一份你的工作表的副本/样本吗? 【参考方案1】:

尝试:

=INDEX(QUERY(SPLIT(FLATTEN(A2:A&"×"&D1:N1&"×"&D2:N), "×"), 
 "where Col3 is not null and Col2 is not null", ))


更新:

=INDEX(QUERY(SPLIT(FLATTEN(A2:A&"×"&D1:N1&"×"&D2:N), "×"), 
 "select Col1,Col2,sum(Col3)
  where Col3 is not null 
    and Col2 is not null
  group by Col1,Col2
  label sum(Col3)''", ))

【讨论】:

感谢您的建议!这几乎为示例数据提供了所需的结果,除了名称列以相反的顺序出现并且结果未聚合。问题是实际数据不包含带有“X”的字段,它们是具有各种数据类型和每种数据类型的各种值的列。因此,该公式无法应用于真实数据。 @Rainier 答案已更新为聚合 谢谢!我能够理解这一点并将其应用于我的原始数据。只需在公式中切换 Col1 和 Col2 即可将它们按正确的属性排序。非常感谢!【参考方案2】:

鉴于您当前的数据集(似乎只扩展到 Col N),将以下内容放在 Col N 右侧的某处:

=ArrayFormula(SPLIT(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SPLIT(QUERY(FLATTEN(FILTER(IF(NOT(ISNUMBER(D2:N)),,D1:N1&"~ "&A2:A&"|"&D2:N),A2:A<>"")),"Select * WHERE Col1 Is Not Null"),"|"),"Select Col1, SUM(Col2) GROUP BY Col1 LABEL SUM(Col2) ''")&"~ "),,2)),"~ ",0,1))

如果将其放在与原始数据不同的工作表中会更好。假设您的原始数据表名为 Sheet1,请将上述公式的以下版本放入新表中:

=ArrayFormula(SPLIT(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SPLIT(QUERY(FLATTEN(FILTER(IF(NOT(ISNUMBER(INDIRECT("Sheet1!D2:"&ROWS(Sheet1!A:A)))),,Sheet1!D1:1&"~ "&Sheet1!A2:A&"|"&INDIRECT("Sheet1!D2:"&ROWS(Sheet1!A2:A))),Sheet1!A2:A<>"")),"Select * WHERE Col1 Is Not Null"),"|"),"Select Col1, SUM(Col2) GROUP BY Col1 LABEL SUM(Col2) ''")&"~ "),,2)),"~ ",0,1))

这种单独的表格方法和公式允许原始数据无限期地扩展超过 Col N。

【讨论】:

哇!那是东西。第一个公式有效,并给出了我想要的结果。然而,第二个公式并不完全相同。它也确实产生了相同的数据,但它在顶部添加了 11 行以及类似这样的附加数据。 1 - 鲍勃 - 2 1 - 詹姆斯 - 2 1 - 吉姆 - 2 1 - 约翰 - 2 1 - 卢克 - 2 1 - 马克 - 4 1 - 保罗 - 2 1 - 皮特 - 2 1 - 理查德 - 2 1 - 罗兰 - 2 1 - Steve - 4 我将不得不仔细查看这个公式中到底发生了什么,以便我可以将它应用到我正在处理的真实世界数据中。谢谢! 如果您的真实数据不是您在帖子中显示的数据,是的,可能会出现意想不到的结果。听起来您在某处拥有数字 1,它被视为一个可行的名称;或者您在不知情的情况下将数字作为文本散布在您的数据中。我们只能根据我们在您的帖子中看到的内容编写解决方案。由于第一个公式满足需求,请将帖子标记为“最佳答案”,以便让整个贡献者社区知道问题已得到解决,并帮助未来的网站访问者更容易找到此解决方案。 嗨,埃里克。第二个公式的意外结果与上面帖子中显示的测试数据有关。现实世界的数据非常相似,但在不应该包含的列中有数字列,因此第一个公式中的 IF(NOT(ISNUMBER(...) 部分可能无法使用。我'我仍在努力理解您提供的两个公式的所有部分。请放心,当我对此有所了解时,我会将问题标记为已回答。同时,我更愿意将问题保持开放,以防万一有人有其他建议。 如果没有看到实际数据(因此有看不见的未知数),尝试猜测建议或解决方案是没有效率的。如果您想分享一个指向您的电子表格的链接(或一个经过消毒但真实的副本),我很乐意看一看。

以上是关于在 Google 表格中整理/汇总特定数据的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

Python - 如何在 Python 中从 Google 表格中读取特定范围的行和列?

如果特定列不为空,则 Google 表格导入范围

Google 表格 - Arrayformula 查询拆分调试

Able2Extract快捷键汇总整理

Able2Extract快捷键汇总整理

检索 Google 表格公式的行号