2011-12-19 9 views
0

私はカンマで区切られた電子メールアドレスの列を持つテーブルを持っています。単一のselectステートメントにそれらを解析してグループ化する方法がありますか?irritative sql文のヘルプが必要

ID  Emails 
1  [email protected], [email protected] 
2  [email protected], [email protected] 

戻り、何かのように:

Email    Count 
[email protected]   1 
[email protected] 2 
[email protected] 1 

私はカーソルと一時テーブルでこれを行うことができます知っているが、いくつかがあった場合、私は確認されませんでした。このようなテーブルで

選択とネストされた選択ステートメントでこれを行うことにきちんとしたやり方。

ありがとうございます。

+2

ストラクチャーをテーブル 'Id、Email'に正規化して、行ごとに1つのメールアドレスと問題を解決します。 –

答えて

2

電子メールリストをXMLに変換し、.nodes.valueを使用してXMLをクエリできます。

declare @T table 
(
    ID int, 
    Emails varchar(100) 
) 

insert into @T values 
(1, '[email protected], [email protected]'), 
(2, '[email protected], [email protected]') 

select T.Email, count(*) as [Count] 
from (
     select X.N.value('.', 'varchar(30)') as Email 
     from @T 
     cross apply (select cast('<x>'+replace(Emails, ', ', '</x><x>')+'</x>' as xml)) as T(X) 
     cross apply T.X.nodes('/x') as X(N) 
    ) as T 
group by T.Email 

結果:

Email       Count 
------------------------------ ----------- 
[email protected]    1 
[email protected]    2 
[email protected]    1 
0

以前はMSSQL xmlのものを使ったことがなかったので、ちょっと座って消化しなければなりませんでしたが、私は実際のテーブル名を使用するように変更しました。これは完璧に機能します。 ここに私がやったことだ(場合には、誰かが私のような一時テーブルなしでこれを使用したい):

select T.Email, count(*) as [Count] 
from ( 
     select X.N.value('.', 'varchar(30)') as Email 
     from reports_schedule rs 
     cross apply (select cast('<x>'+replace(rs.recipient_email, ', ', '</x><x>')+'</x>' as xml)) as T(X) 
     cross apply T.X.nodes('/x') as X(N) 
    ) as T 
group by T.Email 

おかげで再び!