2016-10-18 24 views
0

我有兩個供應商數據庫,這些數據庫在多年來我已經嘗試糾正,已經變得非常不可靠。單個客戶可以有多個id_numbers,這兩個ID存在於兩個供應商數據庫中。單個客戶的所有ID都正確地附加到Vendor1數據庫中的一個客戶記錄(這意味着它們屬於相同的customer_code)。但是,問題是這些相同的ID可能會在Vendor2數據庫中的多個客戶之間分配,這是不正確的。我需要將這些多個客戶合併到Vendor2數據庫中。找到一條記錄,作爲另一個供應商數據庫中的兩條記錄存在

我試圖確定哪些客戶在第二個供應商數據庫中表示爲兩個或更多客戶。到目前爲止,我已將兩者加在一起,但我無法弄清楚如何僅找到具有兩個或多個不同的MemberInternalKeys的客戶,以獲得相同的customer_code

這是我到目前爲止有:

select top 10 
    c.customer_code, 
    i.id_number, 
    cc.MemberInternalKey 
from Vendor1.dbo.customer_info as c 
join Vendor1.dbo.customer_ids as i 
    on c.customer_code = i.customer_code 
join Vendor2.dbo.Clubcard as cc 
    on (i.id_number collate Latin1_General_CI_AS_KS) = cc.ClubCardId 
where i.id_code = 'PS' 

在下面的例子中,我希望在表中只能拿回的最後兩行。前兩行不應包含在結果中,因爲它們對於兩個記錄具有相同的MemberInternalKey,並且屬於相同的customer_code。第三行也不應該包含,因爲兩個供應商數據庫之間有1-1匹配。

customer_code | id_number | MemberInternalKey 
--------------|-----------|------------------ 
5549032  | 4000  | 4926877 
5549032  | 4001  | 4926877 
5031101  | 4007  | 2379218 
2831779  | 4029  | 1763760 
2831779  | 4062  | 4950922 

任何幫助,非常感謝。

回答

1

如果我理解正確的話,你可以使用窗口功能這個邏輯:

select c.* 
from (select c.customer_code, i.id_number, cc.MemberInternalKey, 
      min(MemberInternalKey) over (partition by customer_code) as minmik, 
      max(MemberInternalKey) over (partition by customer_code) as maxmik 
     from Vendor1.dbo.customer_info c join 
      Vendor1.dbo.customer_ids i 
      on c.customer_code = i.customer_code join 
      Vendor2.dbo.Clubcard as cc 
      on (i.id_number collate Latin1_General_CI_AS_KS) = cc.ClubCardId 
     where i.id_code = 'PS' 
    ) c 
where minmik <> maxmik; 

這種計算每個customer_code的最小和最大MemberInternalKey。然後外部where然後只返回這些不同的行。

1

另一種選擇是

Declare @YourTable table (customer_code int, id_number int, MemberInternalKey int) 
Insert Into @YourTable values 
(5549032,4000,4926877), 
(5549032,4001,4926877), 
(5031101,4007,2379218), 
(2831779,4029,1763760), 
(2831779,4062,4950922) 

Select A.* 
From @YourTable A 
Join (
     Select customer_code 
     From @YourTable 
     Group By customer_code 
     Having min(MemberInternalKey)<>max(MemberInternalKey) 
    ) B on A.customer_code=B.customer_code 

返回

customer_code id_number MemberInternalKey 
2831779   4029  1763760 
2831779   4062  4950922 
相關問題