如果唯一的SELECTed列已经在GROUP BY中,为什么还必须选择聚合列才能使用GROUP BY?

时间:2016-06-01 21:30:37

标签: google-sheets google-query-language

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

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

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

transform

但它不是。我收到错误" CANNOT_GROUP_WITHOUT_AGG"。我发现要做到这一点,我需要选择总和(F),如下:

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

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

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

This question以及其他喜欢它的人,不回答我的问题 - 我明白如果我想选择多个列,就像我在上面给出的第二个公式中那样,我需要提供一个聚合功能,以便清楚它们如何分组。但是,在这种情况下,只有一列 - 我只想将它(并且只有它)分组。我在这里错过了哪些不允许的内容?

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

我最终在实践中做的是在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()应输出的值。这似乎是我能找到的最便宜的解决方案。