1

yahoo、google、aol などの各ドメインからの加入者数を特定しようとしています。

これが私が思いついたものですが、思ったほどグループ化されていません

select SUBSTRING(EmailAddress, PATINDEX('%@%', EmailAddress) +1, LEN(EmailAddress) -PATINDEX('%@%', EmailAddress)) As [Domain], COUNT(SUBSTRING(EmailAddress, PATINDEX('%@%', EmailAddress) +1, LEN(EmailAddress) - PATINDEX('%@%', EmailAddress))) As [Count]
from Subscribers
GROUP BY EmailAddress

結果はこんな感じ

yahoo.com   1
gmail.com   1
yahoo.com   1

もっとこういうのが欲しい

yahoo.com   2
gmail.com   1
4

1 に答える 1

1

問題はemailaddress、 の値ではない でグループ化していることですdomain。メールアドレスにjohn@yahoo.comまたはが含まれている場合jim@yahoo.com、それらは一意であるため、グループ化するとカウントが分離されます。

GROUP BYドメイン値でグループ化する場合は、ドメインの計算された式が必要です。

select SUBSTRING(EmailAddress, PATINDEX('%@%', EmailAddress) +1, LEN(EmailAddress) -PATINDEX('%@%', EmailAddress)) As [Domain], 
  COUNT(SUBSTRING(EmailAddress, PATINDEX('%@%', EmailAddress) +1, LEN(EmailAddress) - PATINDEX('%@%', EmailAddress))) As [Count]
from Subscribers
GROUP BY SUBSTRING(EmailAddress, PATINDEX('%@%', EmailAddress) +1, LEN(EmailAddress) -PATINDEX('%@%', EmailAddress));

または、サブクエリを使用してdomainエイリアスでグループ化することもできます。

select domain,
  count(*) [count]
from
(
  select SUBSTRING(EmailAddress, PATINDEX('%@%', EmailAddress) +1, LEN(EmailAddress) -PATINDEX('%@%', EmailAddress)) As [Domain]
  from Subscribers
) d
group by domain;
于 2013-05-01T16:52:45.947 に答える