获取重复数据

时间:2015-03-18 01:35:19

标签: sql-server

请建议SQL查询以查找不同商店的重复客户,例如customer表中有id,name,phone,storeid,我需要为以下内容编写查询:

  1. 商店内的客户重复
  2. 不同商店的客户重复
  3. 表格数据:

    id    name      phone       storeid
    -----------------------------------    
    1     abc        123       4
    2     abc        123       4
    3     abc        123       5
    

    第一个查询应仅显示前2个记录,第二个查询应显示所有3个记录。

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作: -

SELECT Name,Phone, COUNT(Id) NumberOfTimes, StoreID
FROM Customers
GROUP BY Name,Phone,StoreID
HAVING COUNT(Id) > 1
ORDER BY StoreID

希望这有帮助。

答案 1 :(得分:0)

SELECT storeName, customerName FROM customer
WHERE id IN (
  SELECT c.storeid
  FROM customer 'c'
  RIGHT JOIN store 's' ON (c.storeid = s.id)
  GROUP BY c.storeid
  HAVING COUNT(*) > 1
)

基本上,我们按商店进行分组,这使我们可以计算它们在客户表中出现的次数。我们得到了多次出现的情况的id,我们从customer表中选择storeName和CustomerName,其中包含我们从内部查询获得的id。

答案 2 :(得分:0)

解决方案

您可以针对第一个查询尝试此操作:

SELECT *
FROM customer,
WHERE 1 < (
  SELECT COUNT(name)
  FROM customer
  WHERE name IN (
    SELECT name FROM customer
  )
) AND
1 < (
  SELECT COUNT(storeid)
  FROM customer
  WHERE storeid IN (
    SELECT storeid FROM customer
  )
);

现在,对于第二个查询,请使用上面的查询,但删除AND之后的所有内容。

说明

让我们一步一步查看查询:

SELECT *
FROM customer

这表明您需要customers表中的所有列。

WHERE 1 < (
  SELECT COUNT(name)
  FROM customer
  WHERE name IN (
    SELECT name FROM customer
  )
)

这是一个非常长的查询,所以让我们从内向外看。

  WHERE name IN (
    SELECT name FROM customer
  )

这一次,我们获取了客户的所有名称,并检查它们是否与我们的当前表格相匹配。说实话,我们可能不需要整个部分......

  SELECT COUNT(name)
  FROM customer

这表明我们想要在customers表中与where子句匹配的每个名称出现的总次数(count)。

WHERE 1 < (
  ....
)

在这里,我们将比较子查询的结果(重复名称的数量)并检查它是否大于l(即,存在重复)。

AND
.....

AND关键字表示第二个条件必须为真 以及 以前的条件。

完整查询应返回名称存储ID重复的所有条目;如果删除AND之后和之后的所有内容,将导致所有条目具有相同名称但不一定是正确的商店ID。

备注

另外两个答案是建议对重复数据进行分组,但在您的特定情况下,我认为您希望根据您的预期结果重复输入(尽管您应该添加更多预期的输出信息) )。