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);
解释下:
INSTR(EMAIL, '@', 1)会找到@在邮箱字符串中的位置,加1后就是服务商域名的起始位置。SUBSTR(EMAIL, 起始位置)如果不写长度参数,会自动截取到字符串末尾,这样就得到完整的服务商域名。- 最后按提取出来的服务商域名分组,再用
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
相关产品推荐
相关产品推荐

