2017-09-05 68 views
0

我有我的数据库中的电子邮件和电话字段的客户。他们中的一些人既有电话也有电子邮件,其中一些只有电子邮件,其中一些只有电话。不同客户之间的电话和电子邮件可能不是唯一的。通过电话号码或电子邮件获取相同的客户

我需要创建虚拟表,其中数据库将使用同一个电子邮件或电话将客户端计为同一个客户端。例如,我有表:

Phone Email ID 
916 [email protected] 1 
     [email protected] 2 
916   3 
915   4 

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

结果应该是财产以后像

Phone Email ID NewID 
916 [email protected] 1 1 
     [email protected] 2 1 
916   3 1 
915   4 2 
917 [email protected] 5 1 
917 [email protected] 6 1 
+2

这里指定的预期结果作为表,格式化文本了。 – jarlh

+1

请给您的DBMS添加标签,每个可能有不同的解决方案 – JohnHC

+0

是否会有一个既有电话又有电子邮件的记录?是否有perhpas额外的列将具有相同的值可用于一个组的记录?像f.e.客户名称? – LukStorms

回答

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 [email protected] 1 1 
NULL [email protected] 2 1 
916 NULL 3 1 
915 NULL 4 4 
NULL [email protected] 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 [email protected] 1 1 
NULL [email protected] 2 1 
916 NULL 3 1 
915 NULL 4 2 
917 [email protected] 5 1 
917 [email protected] 6 1 
0

你的例子看起来像你的新列只是行与min(id)相同的手机或电话号码

so

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) 
+0

这会导致错误,因为您需要通过'a.phone,a.email,a.id'进行分组。编辑答案为 –

+0

。 –

1

呃,

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]; 
相关问题