Как выбрать записи с дубликатами в нескольких столбцах в синтаксисе SQL Server/Excel?

У меня есть следующая таблица:

[Sheet1$]:

Группа Разделение Имя 555 2 Адам 555 1 Боб 444 1 Сара 555 2 Анна 444 1 Джефф

Я хочу выбрать все записи из [Sheet1$] (я работаю с Excel и ODBC), которые имеют одинаковые Group и Division, но несколько Names. Мне нужны все 3 столбца в списке результатов.

Результат должен быть таким:

Группа Разделение Имя 555 2 Адам 555 2 Анна 444 1 Сара 444 1 Джефф

У меня есть следующий запрос, который приводит к ошибке:

SELECT [Group], [Division], [Name], COUNT(*)
FROM [Sheet1$]
GROUP BY [Group], [Division] 
HAVING COUNT(*) > 1

Приведенный выше запрос не работает из-за одного столбца, не включенного в предложение GROUP BY, насколько я понимаю, но из-за моего ржавого SQL и незнания синтаксиса MS/Excel SQL я не могу сформировать правильный запрос для моей потребности. Как мне отформатировать правильный запрос?

Тег sql-server здесь кажется неуместным. SQL Server — это сервер ядра базы данных. Если вы просто запрашиваете данные в книге Excel, SQL Server неприменим.

Craig 01.02.2023 23:26

У вас есть столбцы в вашем операторе SQL, которые не соответствуют столбцам в ваших примерах наборов данных, поэтому это вызывает некоторое первоначальное замешательство у людей, которые могут захотеть помочь.

Craig 01.02.2023 23:28

Вы включили столбец «Владелец» в предложение SELECT, но не включили столбец «Владелец» в предложение GROUP BY. К любым столбцам, которые вы НЕ включаете в предложение GROUP BY, должна быть добавлена ​​какая-либо функция агрегирования. Например, вы можете указать MIN([Владелец]), и тогда ваш запрос должен выполниться успешно. В противном случае, если к [Владелец] не применяется агрегация, вам необходимо добавить этот столбец в предложение GROUP BY.

Craig 01.02.2023 23:29

я обновил образец sql для ясности. Спасибо что подметил это

h.rashid 02.02.2023 00:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы применяете предложение 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») будет работать, поскольку он будет возвращать только строки с повторяющимися именами. Желаемый результат в вопросе конкретно показывает отдельные имена.

Jason 'Bug' Fenter 01.02.2023 23:48

Теперь, когда я думаю об этом, ваше первое решение имеет аналогичную проблему: оно возвращает только одно имя, а не все из них. И ваш последний пример вообще не возвращает никаких имен. Вы предоставили хорошую образовательную информацию, и я хотел бы проголосовать за вас за это, но на самом деле это не дает OP того результата, который они ищут.

Jason 'Bug' Fenter 01.02.2023 23:51

@ Jason'Bug'Fenter - с тех пор ОП обновил вопрос. При первой публикации предоставленный пример запроса на самом деле не соответствовал образцам наборов данных, поэтому было трудно точно интерпретировать ожидаемый результат данных. Кроме того, фактическая суть исходного вопроса (который все еще находится в конце отредактированного вопроса) заключалась в том, что они специально получали ошибку при попытке запустить свой запрос относительно столбца, не включенного в GROUP BY (и что их SQL был "ржавым"). Я пытался более широко прояснить синтаксис (и параметры) при использовании GROUP BY.

Craig 02.02.2023 01:06

@Jason'Bug'Fenter - что заставляет меня задуматься .... если ответ публикуется на вопрос, но затем вопрос редактируется таким образом, что ответ больше не имеет смысла для этого вопроса, удаляется правильный ответ делать?

Craig 02.02.2023 01:14

хороший вопрос. У меня не было возможности увидеть первоначальную форму вопроса - только отредактированную версию - поэтому я не мог понять, насколько правильно вы решили проблему, которую вам представили. Может быть, вам следует отредактировать свой ответ и поместить заявление об отказе от ответственности вверху? «Первоначально задавался вопрос о том, как использовать GROUP BY. Позже этот вопрос был уточнен. Здесь приведен ответ на исходную форму вопроса». Таким образом, может быть, никто не понизит ответ за то, что он неактуален? Это также может быть хорошим поводом для обсуждения на сайте meta.stackexchange.com.

Jason 'Bug' Fenter 02.02.2023 17:56
Ответ принят как подходящий

Если вам нужны повторяющиеся строки с отдельными владельцами, вам придется выполнить некоторую конкатенацию на месте.

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(), но использование «[Совместное предприятие] + [Подразделение интересов]» (или «[Группа] + [Подразделение] из обновленного поста) работало. .

h.rashid 02.02.2023 00:56

Другие вопросы по теме