【问题标题】:SQL counting email domains from email addressesSQL 从电子邮件地址计算电子邮件域
【发布时间】:2021-02-17 20:39:06
【问题描述】:

我查询的目的是计算具有特定域的关联电子邮件地址的数量。我认为虽然我已经将其与应有的相反,因为我的结果集对两个字段都产生了零计数。

电子邮件地址可能类似于:mike@microsoft.com。我想对共享 Microsoft 电子邮件域的所有电子邮件地址进行计数(对于 AOL/Yahoo 也是如此)。我不确定从这里去哪里 - 有什么想法吗?

select
    count(case when Email in ('%microsoft.com','%live.com','%outlook.com','%hotmail.com','%msn.com','%passport.com') 
        then Email end) as 'Microsoft',
    count(case when Email in ('%yahoo.com','%ymail.com','%yahoomail.com','%aol.com','%cs.com','%netscape.com','%verizon.net','%verizon.com','%bellatlantic.net','%gte.net','%managedmail.com') 
        then Email end) as 'AOL_Yahoo',
    '2021-02-15' as [Date]
from
    IP_Warming_Day_1_New_Registrants

【问题讨论】:

  • 简单的答案是因为 IN 不使用与 LIKE 相同的模式匹配逻辑。通过删除聚合并将实际的电子邮件列添加到选择列表中,您将更清楚地看到这一点。

标签: sql sql-server tsql


【解决方案1】:

我会为此目的拆分域:

select sum(case when v.domain in ('%microsoft.com', '%live.com', '%outlook.com', '%hotmail.com', '%msn.com', '%passport.com') 
                then 1 else 0
           end) as Microsoft,
       sum(case when v.domain in ('yahoo.com', 'ymail.com','yahoomail.com','aol.com','cs.com','netscape.com','verizon.net','verizon.com','bellatlantic.net','gte.net','managedmail.com') 
               then 1 else 0
           end) as AOL_Yahoo,
       '2021-02-15' as [Date]
from IP_Warming_Day_1_New_Registrants nr cross apply
     (values (stuff(nr.email, 1, charindex('@', nr.email), '')) ) v(domain)

你也可以使用like,不过这样比较麻烦:

select sum(case when v.email like '%@microsoft.com' or
                     v.email like '%@live.com' or
                     v.email like '%@outlook.com' or
                     v.email like '%@hotmail.com' or
                     v.email like '%@msn.com' or
                     v.email like '%@passport.com')
                then 1 else 0
           end) as Microsoft,

【讨论】:

  • 小心 - 这不会处理子域。
猜你喜欢
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 2018-07-02
  • 2013-09-29
  • 2023-01-28
  • 2016-04-12
  • 1970-01-01
相关资源
最近更新 更多