Google Sheet - 按单个值排序数据,根据多个条件求和和除法

Google Sheet - Sort data by single value, with sums and divisions based on multiple criteria

我一周前开始使用我最大的 google sheet 公式,我已经达到了我能做的极限。我通常总是通过稍微搜索一下来找到我的问题的答案,但这次不是。

自2017年公司成立以来,我导出了一个项目列表,9000多行。

里面有很多专栏,但我们感兴趣的是:

data screenshot

在另一个sheet中,我想显示一些基于某些标准但基于来自客户的唯一值的列。

列为:

除此之外,我还有专门的单元格来选择日期,这样 table 的用户可以按月和/或年排序(见屏幕截图)。

customer view screenshot

我开始使用 A 列中的 UNIQUE 函数来输出客户列表。然后我根据我的标准在其他列中生成 SUMPRODUCT。但是 6 列 x 600 行的 SUMPRODUCT,googlesheet 每次更改日期时都需要 5 分钟才能给我结果... 所以我环顾四周,发现了 UNIQUE、FILTER 和 SUMIF 组合。

为了帮助我,我在第一个 table 的末尾创建了专栏(参见 1st 屏幕截图),这将帮助我处理 SUMIFS(SOMME.SI 法语), 只需要添加每一行,作为标准的第一列和日期的唯一性。如果我那样做了,那是因为我不能在 ArrayFormula 中做 SUMPRODUCT。

通过一些尝试,我想出了一个巨大的公式。

=sort(
{unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),
    
ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!W2:W)),

ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!X2:X)),

ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!Y2:Y)),

ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!Z2:Z)),

SIERREUR(ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!W2:W))/
ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!X2:X)),""),

SIERREUR(ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!X2:X))/
(ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!X2:X))+
ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!Y2:Y))+
ArrayFormula(SOMME.SI('DATA OPPORTUNITY'!E2:E,unique(filter('DATA OPPORTUNITY'!E2:E,'DATA OPPORTUNITY'!B2:B>=B1,'DATA OPPORTUNITY'!B2:B<=B2)),'DATA OPPORTUNITY'!Z2:Z))),"")}

,A4,SI(B4="croissant",VRAI,FAUX))

当你看到它时真的很可怕,但它确实有效。另一方面,考虑到公式的大小,我告诉自己我可能做的真的很糟糕,必须有一个更简单的解决方案。

关于公式,它让我能够正确显示每一列,使用正确的值,并且用我的日期进行更改需要 1 秒。

我想使用过滤视图对列进行升序排序,但过滤视图不适用于此类公式。因此,我能够使用 SORT,感谢内部的 IF(法语中的 SI),我可以选择要排序的列和方向。

我的最后一个问题,如您在客户视图屏幕截图中所见,我看到客户为 0。这些客户没有向我们下订单,只是丢失、死亡或取消项目。我不能将它们排除在我的计算之外,因为我还需要知道与其他客户丢失的项目数量。我只需要在最后,在计算之后,不显示与我们一起赚0美元的客户的收入。

您如何看待巨人公式,它听起来对您来说是最佳选择吗?对于 0 美元的客户,我该如何隐藏它们?

非常感谢您花时间阅读这篇长文并给予我答复! :)

感谢 Aresvik 的评论指导我找到了正确的解决方案,我能够用这个公式解决我所有的问题:

=QUERY(
   QUERY(
      'DATA OPPORTUNITY'!A2:Z,"select E, sum(W), max(W), sum(X), sum(Z), sum(W)/sum(X), 
      sum(X)/(sum(X)+sum(Y)+sum(Z)) 
      where" &SI(F2<>""," E='"&F2&"' and "," ")& "B >= date '"&TEXTE(B1,"yyyy-mm-dd")&"' 
      and B <= date '"&TEXTE(B2,"yyyy-mm-dd")&"'
      group by E label E'', sum(W)'', max(W)'', sum(X)'', sum(Z)'', sum(W)/sum(X)'', 
      sum(X)/(sum(X)+sum(Y)+sum(Z))''"
   )
   , "select * where Col2 <> 0 and Col2 is not null Order By 
   Col"&SIERREUR(EQUIV(D1,5:5,0),1)&SI(D2="A to Z"," asc"," desc")
)

查询中的查询允许我在第一个查询的计算中考虑丢失的合同,但第二个查询不显示在目标期间未报告收入的客户。 与最初的项目相比,我添加了 max (W),这让我可以了解与客户的最高项目。我还添加了对单元格的引用,以了解我们要按哪一列进行排序,以及它是增加还是减少。最后,在“where”中,只有当单元格被填充时才会出现的条件,允许只显示一个客户。