2017-02-23 56 views
0

我需要查找特定Group中存在的Non-Identical值。請在下面的表Contact在SQL Server中使用Group by查找非相同的值

ContactId FirstName LastName Mobile 
_________________________________________________ 

1   Emma   Watsan  9991234567 
2   Jhon   Wick  8887654321 
1   Emma   Watsan  9990001111 

在這裏,我要取艾瑪WATSAN需要找一個手機號碼是相同的(BOOL - bit)看看如果兩個手機號相同比1否則0

我嘗試以下查詢

SELECT COUNT(*) FROM Contact c 
GROUP BY c.ContactId, c.FirstName, c.LastName 
HAVING COUNT(*) >1 

請幫助我如何找到結果。

+2

似乎只是更改爲'COUNT(DISTINCT Mobile)> 1' – Eric

回答

1

如何:

Select distinct a.ContactId, case when b.mobile is null then 0 else 1 end as [is_duplicate] 
from Contact a 
left join Contact b 
on a.ContactId = b.ContactId 
and a.mobile = b.mobile 
and a.id <> b.id 

哪裏[id]是主鍵列在表中(你應該有一個)。

希望這會有所幫助。

PS:表格未正確標準化 - 如果ContactID重複,則第一個和最後一個名稱不應位於同一個表中。

+0

IMO將不起作用,因爲'LEFT JOIN'將返回Emma Watsan加入自身的第一行並顯示爲重複,即使行在表中只存在一次。他想比較同一個表中的不同行,而不是同一行。 – 3BK

+0

對。編輯。謝謝! –

1

用於獲取有關艾瑪WATSAN Infor的,你可以UE

select * from Contact 
where ContactId in ( 
    select c.ContactId FROM Contact c 
    group by c.ContactId 
    having COUNT(*) >1 
) 

爲獲得具有相同numebr

select c.ContactId, COUNT(distinct Mobile) FROM Contact c 
group by c.ContactId 
having COUNT(distinct Mobile)>1 
聯繫人
+0

我們可以在排名的幫助下做到這一點嗎? –

+0

@TomJMuthirenthi ...爲什麼? ...當sql提供適當的基本(和標準)函數..爲什麼使用一個不標準的函數或所有最常用的數據庫使用的函數? – scaisEdge

1

使用Count(Distinct [Mobile]),讓每ContactId不同的移動nmumbers數量。並且使用CASE表達式給出01的計數。如果計數大於1,則0,否則,1

查詢

select t.[Name], case when t.[Mobile] > 1 then 0 else 1 end as [Mobile_Identity] from(
    select ContactId, 
    max([FirstName] + ' ' + [LastName]) as [Name], 
    count(distinct [Mobile]) as [Mobile] 
    from contacts 
    group by ContactId 
)t; 

如果你只想檢索與多個手機號碼的行,然後用having條款。

select t.[Name], case when t.[Mobile] > 1 then 0 else 1 end as [Mobile_Identity] from(
    select ContactId, 
    max([FirstName] + ' ' + [LastName]) as [Name], 
    count(distinct [Mobile]) as [Mobile] 
    from contacts 
    group by ContactId 
    having count(distinct [Mobile]) > 1 
)t; 
1

試試這個:

create table Contacts(ContactId int,FirstName varchar(15),LastName varchar(15),Mobile bigint) 

    insert into Contacts 
    select 1 ,'Emma','Watsan',9991234567 
    union all 
    select 2,'Jhon','Wick',8887654321 
    union all 
    select 1,'Emma','Watsan',9990001111 

    select c.ContactId, c.FirstName, c.LastName,IIF(cnt>1,1,0)ISIdentitcal 
    from (
    SELECT c.ContactId, c.FirstName, c.LastName, 
    COUNT(*)cnt FROM Contacts c 
    GROUP BY c.ContactId, c.FirstName, c.LastName)c 
1

我會做這樣的事情...(有數據樣本表變量包括)

DECLARE @TABLE TABLE (ContactID INT, Firstname VARCHAR(55), Lastname VARCHAR(55), Mobile VARCHAR(55)); 

INSERT INTO @TABLE VALUES (1, 'Emma', 'Watsan', '9991234567'); 
INSERT INTO @TABLE VALUES (2, 'Jhon', 'Wick', '8887654321'); 
INSERT INTO @TABLE VALUES (1, 'Emma', 'Watsan', '9990001111'); 
INSERT INTO @TABLE VALUES (1, 'Emma', 'Watsan', '9990001111'); 

SELECT 
    T1.FirstName + ' ' + T1.LastName AS Name 
    ,T1.Mobile 
    ,MAX(CASE WHEN T2.RowID IS NULL THEN 0 ELSE 1 END) AS Duplicate 
FROM 
    (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY FirstName,LastName, Mobile) AS RowID 
     ,* 
    FROM @TABLE 
    ) T1 
LEFT JOIN 
    (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY FirstName,LastName, Mobile) AS RowID 
     ,* 
    FROM @TABLE 
    ) T2 
    ON T1.ContactID = T2.ContactID 
    AND T1.Mobile = T2.Mobile 
    AND T1.RowID <> T2.RowID 
GROUP BY T1.FirstName + ' ' + T1.LastName, T1.Mobile 
; 

如果實際的表已經有行號,比起row_number()函數可以跳過並且在表中使用的表的實際行ID。

在這裏的例子中,Emma Watsan有兩次相同的號碼(故意使用),另一個號碼只在表格中顯示一次。重複的手機號碼被標記(Duplicate = 1),但其他號碼不是,根據需要。