Google Sheet - 按单个值排序数据,根据多个条件求和和除法
Google Sheet - Sort data by single value, with sums and divisions based on multiple criteria
我一周前开始使用我最大的 google sheet 公式,我已经达到了我能做的极限。我通常总是通过稍微搜索一下来找到我的问题的答案,但这次不是。
自2017年公司成立以来,我导出了一个项目列表,9000多行。
里面有很多专栏,但我们感兴趣的是:
- 开始日期
- 组织
- 状态(草稿、报价单或订单)
- 草稿或报价金额
- 订单金额
- 状态(失效、丢失、取消、临时、打开、保留、活动、完成)
data screenshot
在另一个sheet中,我想显示一些基于某些标准但基于来自客户的唯一值的列。
列为:
- 一个/客户
- B/收入(订单金额列的总和,如果状态不同于丢失、死亡或取消)
- C / 合同数量(如果状态不同于丢失、死亡或取消的订单数量)
- D / draft 和 quotation 的数量(因此如果状态等于 Draft 或 Quotation 且状态不同于 lost、dead 或 cancelled)
- E/丢失人数(当状态等于丢失、死亡或取消时)
- F / 每份合约的平均金额(B 除以 C)
- G/转化率(C除以C+D+E)
除此之外,我还有专门的单元格来选择日期,这样 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”中,只有当单元格被填充时才会出现的条件,允许只显示一个客户。
我一周前开始使用我最大的 google sheet 公式,我已经达到了我能做的极限。我通常总是通过稍微搜索一下来找到我的问题的答案,但这次不是。
自2017年公司成立以来,我导出了一个项目列表,9000多行。
里面有很多专栏,但我们感兴趣的是:
- 开始日期
- 组织
- 状态(草稿、报价单或订单)
- 草稿或报价金额
- 订单金额
- 状态(失效、丢失、取消、临时、打开、保留、活动、完成)
data screenshot
在另一个sheet中,我想显示一些基于某些标准但基于来自客户的唯一值的列。
列为:
- 一个/客户
- B/收入(订单金额列的总和,如果状态不同于丢失、死亡或取消)
- C / 合同数量(如果状态不同于丢失、死亡或取消的订单数量)
- D / draft 和 quotation 的数量(因此如果状态等于 Draft 或 Quotation 且状态不同于 lost、dead 或 cancelled)
- E/丢失人数(当状态等于丢失、死亡或取消时)
- F / 每份合约的平均金额(B 除以 C)
- G/转化率(C除以C+D+E)
除此之外,我还有专门的单元格来选择日期,这样 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”中,只有当单元格被填充时才会出现的条件,允许只显示一个客户。