You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Group By与Count问题:统计各邮箱服务商用户数

解决邮箱服务商统计的SQL问题

嘿,我来帮你梳理下现有SQL的问题,以及给出正确的写法~

首先看你写的SQL存在两个核心问题:

  • INSTR函数参数顺序搞反了:INSTR的语法是INSTR(源字符串, 要查找的子串, 起始位置),你写成了INSTR('@', EMAIL, 1),这会导致无法正确找到@的位置,自然提取不出正确的服务商域名。
  • GROUP BY的字段错误:你按原始的EMAIL分组,这会让每个不同的邮箱地址单独成组,最终count(*)结果都是1,完全达不到按服务商统计的目的;另外DISTINCT在这里是多余的,因为GROUP BY已经会对分组字段去重了。

正确的SQL写法(通用版本)

我们需要先正确提取邮箱的服务商部分,再按这个提取结果分组统计:

SELECT 
    SUBSTR(EMAIL, INSTR(EMAIL, '@', 1) + 1) AS email_provider,
    COUNT(*) AS user_count
FROM Users
GROUP BY SUBSTR(EMAIL, INSTR(EMAIL, '@', 1) + 1);

解释下:

  1. INSTR(EMAIL, '@', 1)会找到@在邮箱字符串中的位置,加1后就是服务商域名的起始位置。
  2. SUBSTR(EMAIL, 起始位置)如果不写长度参数,会自动截取到字符串末尾,这样就得到完整的服务商域名。
  3. 最后按提取出来的服务商域名分组,再用COUNT(*)统计每组的用户数。

更简洁的数据库专属写法(可选)

如果你的数据库是MySQL/MariaDB,可以用SUBSTRING_INDEX函数更简便:

SELECT 
    SUBSTRING_INDEX(EMAIL, '@', -1) AS email_provider,
    COUNT(*) AS user_count
FROM Users
GROUP BY SUBSTRING_INDEX(EMAIL, '@', -1);

SUBSTRING_INDEX(EMAIL, '@', -1)表示从右往左截取@之后的部分,直接得到服务商域名,代码更简洁。

执行以上正确的SQL后,就能得到你期望的结果:

yahoo.com 2
gmail.com 1

内容的提问来源于stack exchange,提问作者Jake Manet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:10:38