在下面的公式使用的数据中,列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)
首先,为什么会这样呢?文档(found here)声明:“如果使用group by子句,那么select子句中列出的每一列都必须在group by子句中列出,或者由聚合函数包装。”我不明白第一个公式为什么不符合这个标准;select中的每一列(即只有C)都列在group by子句中。
其次,我怎样才能最好地修改这个公式(如果我可以的话),使其只能选择C?如果我没有做错任何事情(值得怀疑,但有可能),有没有办法解决这个问题,或者我只需要处理它?
This question和其他类似的应用程序不会回答我的问题--我知道如果我想选择多个列,就像我在上面给出的第二个公式中所做的那样,我需要提供一个聚合函数,以便清楚地知道如何对它们进行分组。但是,在本例中,只有一列-我只希望将它(并且只对它)进行分组。我在这里遗漏了什么不允许这样做?
发布于 2016-06-22 17:03:05
最简单的解决方案可能是将另一个查询公式包含在第一个查询公式中:
=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")
发布于 2017-04-19 13:57:06
在实践中,我最终做的是在ARRAY_CONSTRAIN()
中包装2列响应,如下所示:
=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()
应该输出的列数。这似乎是我能找到的最便宜的解决方案。
https://stackoverflow.com/questions/37579114
复制相似问题