【问题标题】:Speed up filter and sum results based on multiple criteria?加速基于多个标准的过滤和求和结果?
【发布时间】:2018-03-03 01:31:13
【问题描述】:

我正在过滤然后根据日期范围对交易数据求和,如果一列包含多个可能值之一。

示例数据

    A      |  B  |                C                                  |   D
-----------|-----|---------------------------------------------------|-------
11/12/2017 | POS | 6443 09DEC17 C , ALDI 84 773 , OFFERTON GB        | -3.87
18/12/2017 | POS | 6443 16DEC17 C , CO-OP GROUP 108144, STOCKPORT GB | -6.24
02/01/2018 | POS | 6443 01JAN18 , AXA INSURANCE , 0330 024 1229 GB   | -220.10

我目前有以下公式,虽然有效,但速度确实很慢。

=sum(
  iferror(
     filter(
         Transactions!$D:$D, 
         Transactions!$A:$A>=date(A2,B2,1),
         Transactions!$A:$A<=date(A2,B2,31),
         regexmatch(Transactions!$C:$C, "ALDI|LIDL|CO-OP GROUP 108144|SPAR|SAINSBURYS S|SAINSBURY'S S|TESCO STORES|MORRISON|MARKS AND SPENCER , HAZEL GROVE|HAZELDINES|ASDA")
     )
     ,0
  )
) * -1

公式在单独的表格中,只是一年中每个月结果细分的简单视图

  |   A  | B  |     C
--|------|----|----------
1 | 2017 | 12 | <formula>  # December 2017
2 | 2017 | 11 | <formula>  # November 2017
3 | 2017 | 10 | <formula>  # October 2017

有没有更高效的方法来实现这一点?

我尝试使用ArrayFormulaSUMIF,它们适用于字符串条件,但使用SUMIFS 添加更多条件作为日期,它停止工作。

我想不出使用INDEX 和/或MATCH 的方法

【问题讨论】:

    标签: google-sheets


    【解决方案1】:
    =query(filter( {Transactions!$A:$A,
             Transactions!$D:$D},
             regexmatch(Transactions!$C:$C, "ALDI|LIDL|CO-OP GROUP 108144|SPAR|SAINSBURYS S|SAINSBURY'S S|TESCO STORES|MORRISON|MARKS AND SPENCER , HAZEL GROVE|HAZELDINES|ASDA")
         ), "select year(Col1), month(Col1)+1, -1*sum(Col2) group by year(Col1), month(Col1)+1", 0)
    

    结果是这样的表格:

    year()  sum(month()1())    sum 
    2017                 11    3.87
    2017                 12    6.24
    

    如果需要,添加标签。带标签的示例查询文本:

    "select year(Col1), month(Col1)+1, -1*sum(Col2) group by year(Col1), month(Col1)+1 label year(Col1) 'Year', month(Col1)+1 'Month'"

    结果:

    Year   Month    sum 
    2017      11    3.87
    2017      12    6.24
    

    说明

    • 单一公式报告减少了过滤函数的数量,因此必须更快地工作。
    • 使用的查询语法。 more info here

    【讨论】:

    • 这个美妙的工作在产生输出方面做了很多工作......还有一个问题,是否可以在它不输出任何内容时包含结果为 0 的空月份行?
    • 要包含空月份,您需要将它们添加到数据中。创建“虚拟”月份:=query( { {date(2018,1,1),0} ; {date(2018,2,1),0} ; ... filter(...) }, sql-text, 0)
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多