5

在下面公式使用的数据中,C 列包含产品标题列表(这些不是唯一的,并且很多是空白的);Q 列包含每个产品的类别,F 列包含该产品的销售额。如果可能的话,我想避免发布任何实际数据(因为它属于我的雇主),但如果认为有必要,我可以模拟一些相同格式的虚假行。

我想要做的是生成某个类别中总销售额最高的非空白产品标题列表,按降序排列,限制为 25 个条目。

在我看来,以下公式是完全合法的:

=QUERY('Raw Data'!A:Q, "Select C where Q = 'foo' and C != '' group by C order by sum(F) desc limit 25", 1)

但事实并非如此。我收到错误“CANNOT_GROUP_WITHOUT_AGG”。我发现要完成这项工作,我还需要选择 sum(F) ,如下所示:

=QUERY('Raw Data'!A:Q, "Select C, sum(F) where Q = 'foo' and C != '' group by C order by sum(F) desc limit 25", 1)

首先,这是为什么呢?文档(在此处找到)指出“如果您使用 group by 子句,则 select 子句中列出的每一列都必须在 group by 子句中列出,或者由聚合函数包装。” 我看不出第一个公式如何不遵守这个标准。select 中的每一列(即只有 C)都列在 group by 子句中。

其次,我怎样才能最好地修改这个公式(如果我可以的话)只能选择 C?如果我没有做错任何事情(可疑,但可能),是否有解决方法,还是我必须处理它?

这个问题和其他类似的问题不回答我的问题 - 我知道如果我想选择多个列,就像我在上面给出的第二个公式中所做的那样,我需要提供一个聚合函数,以便清楚它们是如何要分组。但是,在这种情况下,只有一列 - 我只想对它(并且只有它)进行分组。我在这里错过了什么不允许这样做?

4

2 回答 2

1

最简单的解决方案可能是在第一个公式周围包装另一个 QUERY 公式:

=QUERY(QUERY('Raw Data'!A:Q, "select C, sum(F) where Q = 'foo' and C != '' group by C order by sum(F) desc limit 25", 1),"select Col1")

于 2016-06-22T17:03:04.897 回答
0

我最终在实践中所做的是将 2 列响应包装在 中ARRAY_CONSTRAIN(),如下所示:

=ARRAY_CONSTRAIN(QUERY('Raw Data'!A:Q, "Select C, sum(F) where Q = 'foo' and C != '' group by C order by sum(F) desc limit 25", 1), 1, 10000)

10000用于列数任意大,大于我知道的QUERY()应该输出。这似乎是我能找到的最便宜的解决方案。

于 2017-04-19T13:57:06.167 回答