2016-09-24 39 views
1

我需要幫助在下面的問題。我有一個客戶表CustA是有列custid,名,姓,phone1,phone2,lastupdateddate。此表有重複records.a記錄被視爲重複在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 

我已經使用CTE對於這種情況通過名字來劃分,姓氏,PHONE1,PHONE2基於ROWNUMBER。但在CTE查詢中,OR條件仍然是phone1或phone2的挑戰。請分享你的想法。欣賞它。這裏

+0

什麼是識別重複的規則? Phone1和2必須完全相同,但可能會顛倒?必須共用一個電話號碼? –

+0

嗨馬丁,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 

雖然如果不是這種情況,一個是始終空可以使用CASE表達,以確保值以一致的順序呈現。

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

如果在該示例中第二行將包含兩個電話,但其中一個是重複的(並且它會是phone2)? –

+0

謝謝Prdp,我會試試這個並分享結果。 – lms

+0

謝謝prdp和martin,上面的查詢運行良好 – lms

0

這一次也會給你愚弄的列表(可選客戶ID <> A.custid)

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