SQL查询的复杂组

时间:2011-08-04 21:01:00

标签: sql group-by

让我们说如果参加抽奖,你可以获得免费赛车。要参加,请提供姓名,地址,电话号码和电子邮件。只有不同的电子邮件才能参与抽奖。超过10万人参加了抽奖。他们中的许多人使用2或3个不同的电子邮件,但使用相同的名称,地址和电话号码。写一个查询,告诉我表中有多少重复项。我的情况与此类似。

这是表格格式

RecID    Name     Address    Phone    email

假设所有记录都是nvarchar,除了RecID是int。还假设提供了所有字段。我不知道如何在需要的3列匹配时使用group by。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您只需使用GROUP BY中所有相同的字段:

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

返回的记录是具有重复项的名称,地址,电话组合。重复的数量是所有Count(*)的总和减去查询返回的记录数(因为从技术上讲,每个组中的一个不是重复的,只有其余的一个)。

答案 2 :(得分:-1)

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,以确保重复项最终彼此相邻。

“注意上面代码中的错误;我只是证明它是正确的,没有尝试过。” - 唐纳德克努特