我的客户端在我的数据库中有电子邮件和电话字段。他们中的一些人同时拥有电话和电子邮件,其中一些只是电子邮件,其中一些只是电话。不同客户之间的电话和电子邮件不是唯一的。
我需要创建虚拟表,数据库将使用与同一客户端相同的电子邮件或电话来计算客户端。例如,我有表:
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
答案 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)