2017-02-23 6 views
0

特定のグループに非同一値が存在することを確認する必要があります。そうでない場合は0両方の携帯電話番号が1より同一である場合 - 親切ContactSQL ServerでGroup byを使用して同一でない値を検索

ContactId FirstName LastName Mobile 
_________________________________________________ 

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

次の表に見てここで私は、エマWatsanをフェッチする必要があると(bitブール値)の携帯電話番号が同一である見つける必要があります。

私は次のクエリ

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

が親切にどのように結果を見つけるために私を支援してみました。

+2

「LEUNT JOIN」がEmma Watsanの最初の行を返して重複して表示するので、これは機能しません。「COUNT(DISTINCT Mobile)> 1」 – Eric

答えて

1

方法について:

[id]は、テーブルの主キー列です
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 

(あなたは1を持っている必要があります)。

これが役に立ちます。

PS:テーブルが正常に正規化されていない - ContactIDが繰り返される場合、姓と名が同じテーブルにあるべきではありません。

+0

IMOこれは機能しません。行はテーブルに一度だけ存在します。同じ行ではなく、同じ表の異なる行を比較したいと考えています。 – 3BK

+0

右。編集されました。ありがとうございました! –

1

同じnumebr

select c.ContactId, COUNT(distinct Mobile) FROM Contact c 
group by c.ContactId 
having COUNT(distinct Mobile)>1 
を持っている連絡先を取得するためにあなたが

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

をUEができエマWatsanに関連インフォアを得るため

+0

ランクの助けを借りてこれを行うことはできますか? –

+0

@TomJMuthirenthi ...なぜ? ... sqlが適切な基本(および標準)関数を提供するとき...標準でないか、最も一般的なすべてのデータベースで使用される関数を使用するのはなぜですか? – scaisEdge

1

使用Count(Distinct [Mobile])ContactIdごとに異なる携帯nmumbersの数を取得します。そして、の式を使用して、数に基づいて0または1を与えます。カウントが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は同じ番号を2回(意図的に)使用し、別の番号は表に1回だけ表示します。重複した携帯電話番号は(Duplicate = 1)と表示されますが、他の番号は必要に応じて表示されません。