2011-12-19 212 views
0

我有一個包含以逗號分隔的電子郵件地址列的表。在單個select語句中是否有辦法將它們解析出來並通過它們進行分組?需要刺激的sql語句幫助

在這樣的表:

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

返回類似:

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

我知道我可以用光標和臨時表做到這一點,但我不知道,如果有一些巧妙地使用select和nested select語句來做到這一點。

在此先感謝。

+2

將你的結構標準化爲一個表格'Id,Email',每行一個郵件地址並解決問題。 – 2011-12-19 16:37:08

回答

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的東西,但我改變它使用我的實際表名,它的工作完美,omg,非常感謝你。 這裏是我做了什麼(萬一有人想利用這些沒有一個臨時表像我):

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 

再次感謝!