2017-10-30 13 views
0

IDとメールフィールドを含むCustomerテーブルがあります。私は、同じメールを重複するすべての顧客を返すために、次のクエリを書いている:重複行をマージする

SELECT ID, Email 
FROM Customer a 
WHERE EXISTS (SELECT 1 
       FROM Customer b 
       WHERE a.Email = b.Email 
       GROUP BY Email 
       HAVING COUNT(Email) = 2) 
ORDER BY Email 

これは、次のようになり、レコード戻っている:これは動作しますが

ID Email 
1  [email protected] 
2  [email protected] 
3  [email protected] 
4  [email protected] 

を、私は実際にデータを必要とします

ID1 Email1   ID2 Email2 
1  [email protected] 2  [email protected] 
3  [email protected]  4  [email protected] 

これを達成する最も良い方法は何ですか。

答えて

0

試してみてください。

SELECT MIN(ID) ID, Email, MAX(ID) ID2, Email AS EMAIL2 
FROM Customer GROUP BY Email 

あなたはCOUNT(メール)= 2 HAVINGたい場合は、それがこの

SELECT MIN(ID) ID, Email, MAX(ID) ID2, Email AS EMAIL2 
FROM Customer GROUP BY Email 
HAVING COUNT(Email) = 2 
+0

おかげで、香港のようになります。私の状況は、3つ以上のマッチが異なって扱われているかのように、2つの重複に特有のものです。ここのすべての返事はうまくいくようですが、私はあなたの答えの単純さが好きです。 – user3676641

1

1つの方法は、条件付き集計です。 。 。あなたが最も2通の電子メールで、持っていると仮定すると:

select max(case when seqnum = 1 then id end) as id_1, 
     email as email_1, 
     max(case when seqnum = 2 then id end) as id_2, 
     email as email_2 
from (select t.*, row_number() over (partition by email order by id) as seqnum 
     from t 
    ) t 
group by email; 

実際には、理由だけでない。

select email, count(*) as num_dups, min(id) as id_1, 
     (case when count(*) > 1 then max(id) end) as id_2 
from t 
group by email; 
0

あなたのレイアウトはあなただけ2つの重複の合計を持つことができることを前提としています。

代わりに以下のようなIDを表示することはありますか?

declare @Duplicates table (Email varchar(50), Customers varchar(100)) 
insert @Duplicates select Email, '' from Customer group by Email having count(*) > 1 

UPDATE d 
SET 
    Customers= STUFF(( SELECT ','+ cast(ID as varchar(10)) 
         FROM Customer c 
         WHERE c.Email = d.Email    
         FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') 
FROM @Duplicates AS d 

select * from @Duplicates 
order by Email 
関連する問題