1

SQL Server に次の列を含むテーブルがあります。

MEMBERID, MEMBEREMAIL, FATHEREMAIL, MOTHEREMAIL, MEMBERNAME

MEMBERIDPKです。3 つの電子メール列は一意ではないため、同じ電子メールが同じ行と複数の行に複数回表示される場合があります。

メールの一意のリストを抽出しようとしていますが、メールごとに and も取得しますmemberid(membernameどのレコードからでも構いません)。

たとえば、3 つの行があるとします。

1   x@x.com   y@y.com   y@y.com   Mark
2   z@z.com   y@y.com   x@x.com   John
3   x@x.com   y@y.com   z@z.com   Susan

x@x.com, y@y.com, z@z.com3 つの電子メール ( ) を取得し、それらのそれぞれについて、それらが表示されるようにしたいと考えてMEMBERIDいます。MEMBERIDどちらでもない(たとえば、結果に 1 回しか表示されないx@X.com限り、1 とマークまたは 2 とジョンまたは 3 とスーザンの値を取得してもかまいません。x@x.com

電子メール、メンバー ID、およびメンバー名を返そうとするときに DISTINCT を使用すると、もちろんすべての行が取得されます。

4

2 に答える 2

3

サブクエリを使用して、すべての電子メールを正規化できます。次に、メールごとrow_numberに 1 つを除外するために使用できます。memberid, membername

select  *
from    (
        select  row_number() over (partition by email order by memberid) as rn
        ,       *
        from    (
                select  MEMBERID
                ,       MEMBERNAME
                ,       MEMBEREMAIL as email
                from    YourTable
                union all
                select  MEMBERID
                ,       MEMBERNAME
                ,       FATHEREMAIL
                from    YourTable
                union all
                select  MEMBERID
                ,       MEMBERNAME
                ,       MOTHEREMAIL
                from    YourTable
                ) as emails
        ) num_emails
where   rn = 1

UNPIVOT次のように、句を使用してメールを正規化することもできます。

select  *
from    (
        select  row_number() over (partition by email order by memberid) as rn
        ,       *
        from    (
                select  MEMBERID
                ,       MEMBERNAME
                ,       email
                from    YourTable
                unpivot (
                                email
                        for     emailOwner
                        in      (
                                MEMBEREMAIL,
                                FATHEREMAIL,
                                MOTHEREMAIL
                                )
                        ) as u
                ) as emails
        ) num_emails
where   rn = 1

SQL Fiddleで両方のバージョンを試してください:

于 2012-07-03T09:28:45.237 に答える
0

このコードは、個別の電子メールの適切なグループを提供します。次に、クエリメンバーからカーソルを作成し、このコンセプトでメンバー ID ごとにカンマ区切りのメールのリストを取得できます。このための出力テーブルを作成すると、より簡単になります。将来の使用のためにそれが必要であり、カスタム テーブルを作成するためのストア プロシージャを作成します。

select mem.*, mails.MEMBEREMAIL
from (
    select MEMBERID,max(MEMBERNAME) as MEMBERNAME
    from table
    group by MEMBERID
)  as mem 
inner join 
(
    select distinct MEMBERID, MEMBEREMAIL
    from (
        select MEMBERID, MEMBEREMAIL
        from table
        union
        select MEMBERID, FATHEREMAIL
        from table
        union
        select MEMBERID, MOTHEREMAIL
        from table
    ) as mail
) as mails on mem.MEMBERID = mails.MEMBERID
于 2012-07-03T09:55:55.567 に答える