Как выбрать три столбца из двух таблиц и сгруппировать по двум столбцам в SQL - PullRequest
0 голосов
/ 30 января 2019

У меня работает SQL-запрос, но мне нужно добавить еще один столбец.Этот столбец находится в другой таблице, и я не могу понять, как все это объединить.

Вот код, который работает ... он выбирает всех активных пользователей, которые делят имя и фамилию с другим пользователем(мы ищем дубликаты)

SELECT UserTable.LastName, 
       UserTable.FirstName 
FROM UserTable
INNER JOIN InfoTable 
  ON InfoTable.ID=UserTable.ID
WHERE InfoTable.Number > 2500 and Infotable.Inactive = 0
GROUP BY FirstName, 
         LastName
HAVING COUNT(*) > 1;

Мне нужно изменить этот код, чтобы я мог отображать столбец NUMBER, который находится в InfoTable, однако я не хочу включать NUMBER вGROUP BY, потому что NUMBER всегда будет уникальным, поэтому он не вернет никаких результатов.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если ваша СУБД поддерживает функции Windows (также называемые функциями OLAP), вы можете просто сделать:

SELECT x.*
FROM (
    SELECT 
        u.LastName, 
        u.FirstName,
        i.Number,
        COUNT(u.ID) OVER (PARTITION BY u.LastName, u.FirstName) cnt
    FROM 
        UserTable u
        INNER JOIN InfoTable i 
            ON  u.ID = I.ID
            AND i.Number > 2500 
            AND i.Inactive = 0
) x WHERE x.cnt > 1
ORDER BY 1, 2, 3

Внутренний запрос использует COUNT ... OVER, чтобы добавить к каждой записи количество пользователей, которые имеют одинаковые первыеи фамилия, и внешние фильтры запроса в омонимах.

0 голосов
/ 30 января 2019

Вы не можете SELECT столбцы, которых нет в GROUP BY.Предложение GROUP BY указывает движку на создание групп из указанных столбцов.Как только строки сгруппированы, вы можете только SELECT столбцов в предложении GROUP BY или агрегатов не сгруппированных столбцов.

Что-то подобное должно работать.Сначала подзапрос получает дубликаты пар FirstName / LastName, затем основной запрос JOIN s возвращается к исходным таблицам, чтобы показать желаемый результат.

SELECT I.Number, U.LastName, U.FirstName
FROM InfoTable I
JOIN UserTable U
ON I.ID = U.ID
JOIN
(
    SELECT U.LastName, U.FirstName
    FROM UserTable U
    JOIN InfoTable I
    ON U.ID = I.ID
    WHERE I.Number > 2500 AND I.Inactive = 0
    GROUP BY U.LastName, U.FirstName
    HAVING COUNT(*) > 1
) T
ON U.FirstName = T.FirstName AND U.LastName = T.LastName
ORDER BY I.Number, U.LastName, U.FirstName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...