Почему я должен также ВЫБРАТЬ агрегированный столбец, чтобы иметь возможность использовать GROUP BY, если единственный выбранный столбец уже находится в GROUP BY?

В данных, используемых в приведенной ниже формуле, столбец 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». Я обнаружил, что для этой работы мне также нужно выбрать сумму (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? Если я не делаю ничего плохого (сомнительно, но возможно), есть ли обходной путь для этого, или мне нужно просто с этим справиться?

Этот вопрос и другие подобные, не отвечайте на мой вопрос - я понимаю, что если я хочу выбрать несколько столбцов, как я это делаю во второй приведенной выше формуле, мне нужно предоставить функцию агрегирования, чтобы было ясно, как они должны быть сгруппированы. В этом случае, однако, есть только один столбец - я просто хочу, чтобы он (и только он) был сгруппирован. Что мне здесь не хватает, что не позволяет этого?


person ModelHX    schedule 01.06.2016    source источник


Ответы (2)


Самое простое решение - обернуть еще одну формулу 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")

person Chris Hick    schedule 22.06.2016

На практике я закончил тем, что заключил ответ из двух столбцов в 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() должен выводить. Это кажется самым дешевым решением, которое я могу найти.

person ModelHX    schedule 19.04.2017