2016-09-24 8 views
1

私は下のissue.iのヘルプが必要です。列custid、名、姓、電話番号1、電話番号2、最終更新日を持つ顧客テーブルCustAを持っています。SQLが重複して更新されています

first name & surname & (phone1 or phone2) is duplicated 
custid firstname surname phone1 phone2 lastupdateddate 

1000  Sam  Son  334566 NULL 1-jan-2016 
1001  sam  son  NULL 334566 1-feb-2016 

私はROWNUMBERに基づいてファーストネーム、姓、のphone1、phone2のでパーティションするために、このシナリオのために、CTEを使用している場合は、この表には、重複records.aレコードがCustAテーブル内の重複と見なされています。しかし、OR条件は、CTEクエリでphone1またはphone2のチャレンジとして残ります。あなたの考えを共有してください。感謝します。それは当てはまらない場合は、1つは常にあなたが値を一貫した順序で提示されていることを確認するためにCASE表現を使用することができますNULLであることけれども、ここで

+0

をあなたにdupesのリストを与える(別売お客様ID <> A.custid)しますかPhone1とPhone2はまったく同じではなく、逆の可能性がありますか?電話番号を共有する必要がありますか? –

+0

こんにちはMartin、phone1とphone2は同じでなければなりません。例:8134567890または(813)4167890または813-416-7890は同じであり、コードを使用して必要なフォーマットに整えます。 – lms

答えて

1

トリックはCOALESCE

With cte as 
(
select Count()over(partition by firstname, lastname, coalesce(phone1, phone2)) as cnt,* 
From yourtable 
) 
Select * from CTE 
WHere cnt > 1 

です。

WITH cte 
    AS (SELECT COUNT(*) 
        OVER(
        partition BY firstname, 
           lastname, 
           CASE WHEN phone1 < phone2 THEN phone1 ELSE phone2 END, 
           CASE WHEN phone1 < phone2 THEN phone2 ELSE phone1 END) AS cnt, 
       * 
     FROM yourtable) 
SELECT * 
FROM CTE 
WHERE cnt > 1 
+0

例では2番目の行に2つの電話機が含まれていますが、 phone2となりますか?) –

+0

Prdpありがとう、私はこれを試し、結果を共有します。 – lms

+0

prdpとmartinに感謝しています。上のクエリはうまく機能しました。 – lms

0

この1つはまた、重複を識別するためのルールは何ですか?

Declare @Yourtable table (custid int,firstname varchar(50),surname varchar(50),phone1 varchar(25),phone2 varchar(25),lastupdate date) 
Insert into @Yourtable values 
(1000,'Sam','Son' ,'334566',NULL ,'1-jan-2016'), 
(1001,'sam','son' ,NULL ,'334566','1-feb-2016'), 
(1003,'sam','son' ,NULL ,NULL ,'2-feb-2016'), 
(1002,'Not','ADupe',NULL ,NULL ,'1-feb-2016') 

Select A.* 
     ,B.Dupes 
From @YourTable A 
Cross Apply (Select Dupes=(Select Stuff((Select Distinct ',' + cast(custid as varchar(25)) 
           From @YourTable 
           Where custid<>A.custid 
           and firstname=A.firstname 
           and surname =A.surname 
           and (IsNull(A.phone1,'') in (IsNull(phone1,''),IsNull(phone2,'')) or IsNull(A.phone2,'') in (IsNull(phone1,''),IsNull(phone2,''))) 
           For XML Path ('')),1,1,'') 
          ) 
      ) B 
Where Dupes is not null 

戻り

custid firstname surname phone1 phone2 lastupdate Dupes 
1000 Sam   Son  334566 NULL 2016-01-01 1001,1003 
1001 sam   son  NULL 334566 2016-02-01 1000,1003 
1003 sam   son  NULL NULL 2016-02-02 1000,1001 
+0

上記のものも試してみました。 – lms

関連する問題