Сложная группа по SQL-запросу - PullRequest
0 голосов
/ 05 августа 2011

Допустим, есть бесплатная машина, которую вы можете выиграть, если будете участвовать в розыгрыше. Для участия необходимо указать имя, адрес, номер телефона и адрес электронной почты. Для участия в розыгрыше требуется только другой адрес электронной почты. В розыгрыше приняли участие более 100 000 человек. Многие из них использовали 2 или 3 разных электронных письма, но использовали одно и то же имя, адрес и телефонные номера. Напишите запрос, который скажет мне, сколько дубликатов в таблице. Моя ситуация похожа на это.

Вот формат таблицы

RecID    Name     Address    Phone    email

Предположим, что все записи являются nvarchar, кроме RecID, который является int. Также предположим, что все поля заполнены. Я не знаю, как использовать группу, когда 3 столбца совпадают в обязательном порядке.

Ответы [ 3 ]

1 голос
/ 05 августа 2011

Вы просто используете все поля, которые должны быть одинаковыми в вашем GROUP BY:

SELECT Name, Address, Phone, Count(*)
  from  MyTAble
GROUP BY Name, Address, Phone
HAVING Count(*) > 1

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

1 голос
/ 05 августа 2011
SELECT Name, Address, Phone, COUNT(*) as NumEntries
    FROM YourTable
    GROUP BY Name, Address, Phone
    HAVING COUNT(*) > 1 /* Duplicates exist */

И, если вы хотите, чтобы отдельные адреса электронной почты были включены:

SELECT t.Name, t.Address, t.Phone, t.email, q.NumEntries
    FROM YourTable t
        INNER JOIN (SELECT Name, Address, Phone, COUNT(*) as NumEntries
                        FROM YourTable
                        GROUP BY Name, Address, Phone
                        HAVING COUNT(*) > 1 /* Duplicates exist */) q
            ON t.Name = q.Name
                AND t.Address = q.Address
                AND t.Phone = q.Phone
    ORDER BY t.Name, t.Address, t.Phone, t.email
0 голосов
/ 05 августа 2011
SELECT * 
FROM table
WHERE Phone IN
    (   SELECT Phone
        FROM table 
        GROUP BY Name, Address, Phone
        WHERE COUNT(Name) > 1
    ) AS A

Это должно получить всю строку для каждого дубликата.
Вы можете добавить ORDER BY Name, Address, Phone к внешнему запросу, чтобы убедиться, что дубликаты оказываются рядом друг с другом.

«Остерегайтесь ошибок в приведенном выше коде; я только доказал, что это правильно, а не пробовал». - Дональд Кнут

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...