У меня есть следующая таблица:
[Sheet1$]
:
Я хочу выбрать все записи из [Sheet1$]
(я работаю с Excel и ODBC), которые имеют одинаковые Group
и Division
, но несколько Names
. Мне нужны все 3 столбца в списке результатов.
Результат должен быть таким:
У меня есть следующий запрос, который приводит к ошибке:
SELECT [Group], [Division], [Name], COUNT(*)
FROM [Sheet1$]
GROUP BY [Group], [Division]
HAVING COUNT(*) > 1
Приведенный выше запрос не работает из-за одного столбца, не включенного в предложение GROUP BY
, насколько я понимаю, но из-за моего ржавого SQL и незнания синтаксиса MS/Excel SQL я не могу сформировать правильный запрос для моей потребности. Как мне отформатировать правильный запрос?
У вас есть столбцы в вашем операторе SQL, которые не соответствуют столбцам в ваших примерах наборов данных, поэтому это вызывает некоторое первоначальное замешательство у людей, которые могут захотеть помочь.
Вы включили столбец «Владелец» в предложение SELECT, но не включили столбец «Владелец» в предложение GROUP BY. К любым столбцам, которые вы НЕ включаете в предложение GROUP BY, должна быть добавлена какая-либо функция агрегирования. Например, вы можете указать MIN([Владелец]), и тогда ваш запрос должен выполниться успешно. В противном случае, если к [Владелец] не применяется агрегация, вам необходимо добавить этот столбец в предложение GROUP BY.
я обновил образец sql для ясности. Спасибо что подметил это
Если вы применяете предложение GROUP BY к своему оператору SQL, то все столбцы в предложении SELECT, которые не являются агрегированными, должны быть включены в предложение GROUP BY.
Итак, в вашем примере у вас в основном есть три варианта.
Добавьте какую-нибудь «агрегацию» в столбец [Владелец]
SELECT [Joint Venture], [Division of Interest], MIN([Owner]), COUNT(*)
FROM [Sheet1$]
GROUP BY [Joint Venture], [Division of Interest] HAVING COUNT(*)>1
Добавьте столбец [Владелец] в предложение GROUP BY (если вы не хотите применять агрегацию)
SELECT [Joint Venture], [Division of Interest], [Owner], COUNT(*)
FROM [Sheet1$]
GROUP BY [Joint Venture], [Division of Interest], [Owner] HAVING COUNT(*)>1
--или-- Удалите столбец [Владелец] из предложения SELECT
SELECT [Joint Venture], [Division of Interest], COUNT(*)
FROM [Sheet1$]
GROUP BY [Joint Venture], [Division of Interest] HAVING COUNT(*)>1
Я не думаю, что ваш второй вариант («Добавить владельца в предложение Group By») будет работать, поскольку он будет возвращать только строки с повторяющимися именами. Желаемый результат в вопросе конкретно показывает отдельные имена.
Теперь, когда я думаю об этом, ваше первое решение имеет аналогичную проблему: оно возвращает только одно имя, а не все из них. И ваш последний пример вообще не возвращает никаких имен. Вы предоставили хорошую образовательную информацию, и я хотел бы проголосовать за вас за это, но на самом деле это не дает OP того результата, который они ищут.
@ Jason'Bug'Fenter - с тех пор ОП обновил вопрос. При первой публикации предоставленный пример запроса на самом деле не соответствовал образцам наборов данных, поэтому было трудно точно интерпретировать ожидаемый результат данных. Кроме того, фактическая суть исходного вопроса (который все еще находится в конце отредактированного вопроса) заключалась в том, что они специально получали ошибку при попытке запустить свой запрос относительно столбца, не включенного в GROUP BY (и что их SQL был "ржавым"). Я пытался более широко прояснить синтаксис (и параметры) при использовании GROUP BY.
@Jason'Bug'Fenter - что заставляет меня задуматься .... если ответ публикуется на вопрос, но затем вопрос редактируется таким образом, что ответ больше не имеет смысла для этого вопроса, удаляется правильный ответ делать?
хороший вопрос. У меня не было возможности увидеть первоначальную форму вопроса - только отредактированную версию - поэтому я не мог понять, насколько правильно вы решили проблему, которую вам представили. Может быть, вам следует отредактировать свой ответ и поместить заявление об отказе от ответственности вверху? «Первоначально задавался вопрос о том, как использовать GROUP BY. Позже этот вопрос был уточнен. Здесь приведен ответ на исходную форму вопроса». Таким образом, может быть, никто не понизит ответ за то, что он неактуален? Это также может быть хорошим поводом для обсуждения на сайте meta.stackexchange.com.
Если вам нужны повторяющиеся строки с отдельными владельцами, вам придется выполнить некоторую конкатенацию на месте.
SELECT [Joint Venture], [Division of Interest], [Owner]
FROM [Sheet1$]
WHERE CONCAT([Joint Venture], [Division of Interest]) IN
(
SELECT CONCAT([Joint Venture], [Division of Interest])
FROM [Sheet1$]
GROUP BY [Joint Venture], [Division of Interest]
HAVING COUNT (*) > 1
)
Предполагается, что драйвер ODBC для Excel поддерживает метод CONCAT()
. Если это не так, вы можете попробовать [Joint Venture] + [Division of Interest]
в обоих местах, если CONCAT()
не работает.
Спасибо Джейсон! Объединение двух сгруппированных столбцов сработало. Единственное отличие от приведенного выше решения заключалось в том, что Excel не распознавал функцию CONCAT(), но использование «[Совместное предприятие] + [Подразделение интересов]» (или «[Группа] + [Подразделение] из обновленного поста) работало. .
Тег sql-server здесь кажется неуместным. SQL Server — это сервер ядра базы данных. Если вы просто запрашиваете данные в книге Excel, SQL Server неприменим.