SQL查询:按邮箱去重统计各团队用户与成员表总唯一人数
解决方案
前提说明
当前无表结构修改权限,涉及3张表结构与示例数据:
Team User Member ID | Name ID | TeamId | Email ID | TeamId | Email ---------- 1 | Team A 1 | 1 | a@email.com 1 | 1 | a@email.com 2 | Team B 2 | 1 | b@email.com 2 | 1 | b@email.com 3 | Team C 3 | 1 | c@email.com
统计要求:
- 按团队维度统计
User、Member两表中去重邮箱对应的总人数 - 同一邮箱在同团队的两表中同时出现时仅计数1次
- 返回字段为
TeamName(团队名)、TotalUsers(去重后总人数) - 示例中Team A预期统计值为3
实现SQL
核心逻辑是先通过UNION合并两表的TeamId+Email数据,利用UNION自动去重的特性剔除同团队下的重复邮箱,再关联团队表分组计数即可,兼容无成员的空团队场景:
SELECT t.Name AS TeamName, COUNT(ue.Email) AS TotalUsers FROM Team t LEFT JOIN ( SELECT TeamId, Email FROM User UNION SELECT TeamId, Email FROM Member ) ue ON t.ID = ue.TeamId GROUP BY t.ID, t.Name;
逻辑说明
- 用
LEFT JOIN关联去重后的邮箱集合,确保没有任何用户/成员的团队(如示例中的Team B、Team C)不会被过滤,这类团队的TotalUsers会返回0 - 选择
UNION而非UNION ALL:UNION会自动对结果集中的完全重复行做去重,刚好满足同团队下重复邮箱只保留1条的规则,无需额外加DISTINCT做二次处理 - 分组时同时传入
t.ID和t.Name:避免不同团队重名导致的统计错误,因为ID是Team表的主键,能唯一标识一个团队
示例数据运行结果
| TeamName | TotalUsers |
|---|---|
| Team A | 3 |
| Team B | 0 |
| Team C | 0 |
内容的提问来源于stack exchange,提问作者Kevin I
相关产品推荐
相关产品推荐

