通过电话号码或电子邮件获取相同的客户

时间:2017-09-05 07:37:28

标签: sql database

我的客户端在我的数据库中有电子邮件和电话字段。他们中的一些人同时拥有电话和电子邮件,其中一些只是电子邮件,其中一些只是电话。不同客户之间的电话和电子邮件不是唯一的。

我需要创建虚拟表,数据库将使用与同一客户端相同的电子邮件或电话来计算客户端。例如,我有表:

Phone  Email   ID
916    x@.com  1
       x@.com  2
916            3
915            4

查询应该创建第4列,它将为ID为1,2和3的客户端显示唯一相同的值。

结果应该是

Phone  Email   ID  NewID
916    x@.com  1   1
       x@.com  2   1
916            3   1
915            4   2
917    x@.com  5   1
917    y@.en   6   1

3 个答案:

答案 0 :(得分:1)

您可以通过电话或电子邮件自行加入桌面 然后GROUP BY并使用MIN显示最低ID。

实施例:

select t.Phone, t.Email, t.ID, min(t2.ID) as NewID
from YourTable t
left join YourTable t2 on (t2.Email = t.Email or t2.Phone = t.Phone)
group by t.ID, t.Phone, t.Email

示例结果:

Phone Email  ID NewID
----- ------ -- -----
916   x@.com 1  1
NULL  x@.com 2  1
916   NULL   3  1
915   NULL   4  4
NULL  y@.com 5  5

但要获得预期的结果?
手机链接优先哪里,即使它是NULL? 您可以使用额外的自我加入:

实施例:

select t.Phone, t.Email, t.ID, coalesce(min(t3.ID), min(t2.ID)) as NewID
from YourTable t
left join YourTable t2 on (t2.Email = t.Email or t2.Phone = t.Phone)
left join YourTable t3 on (t3.Email = t2.Email or (t.Email is null and t3.Email is not null and t3.Phone is null))
group by t.ID, t.Phone, t.Email

示例结果:

Phone Email   ID NewID
----- ------- -- -----
916   x@.com  1  1
NULL  x@.com  2  1
916   NULL    3  1
915   NULL    4  2
917   x@.com  5  1
917   y@.en   6  1

答案 1 :(得分:1)

ERM,

SELECT
          T.[Id]
          T.[Phone]
          T.[Email]
          E.[Id] [NewId]    
   FROM
          [Table] T
       JOIN
          [Table] E
              ON T.[Email] = E.[Email]
UNION
SELECT
          T.[Id]
          T.[Phone]
          T.[Email]
          P.[Id] [NewId]    
   FROM
          [Table] T
       JOIN
          [Table] P
              ON T.[Phone] = P.[Phone];

答案 2 :(得分:0)

您的示例看起来像新列只是具有相同电话号码或电话号码的min(id)

所以

SELECT DISTINCT a.phone, a.email, a.id, min(b.id) 
from clients a join clients b on (a.phone = b.phone OR a.email = b.email)