Oracle中按EmployeeID统计不同姓名数量的SQL实现问题
解决Oracle中按EmployeeID统计唯一姓名组合数量的问题
嗨,这个需求其实很好实现,核心思路就是先对每个EmployeeID下的FirstName+LastName组合去重,再统计去重后的数量。这里给你两种常用的解决方案:
方案一:子查询去重后分组统计
这种方法先通过子查询筛选出所有不重复的员工ID+姓名组合,再在外层按员工ID分组统计数量,逻辑清晰不容易出错:
SELECT EmployeeID, COUNT(*) AS UniqueNameCount FROM ( -- 先获取每个员工的唯一姓名组合 SELECT DISTINCT EmployeeID, FirstName, LastName FROM EmployeeName ) unique_names GROUP BY EmployeeID ORDER BY EmployeeID;
执行这个语句后,子查询会先把重复的姓名组合(比如EmployeeID=1的两条ABC|DEF)过滤掉,外层再统计每个员工剩下的组合数,正好符合你的预期结果。
方案二:使用COUNT(DISTINCT)拼接字段统计
Oracle的COUNT(DISTINCT)支持对拼接后的字段去重统计,不过要注意添加一个不会出现在姓名里的分隔符,避免不同组合拼接后产生冲突(比如AB+C和A+BC直接拼接会变成一样的):
SELECT EmployeeID, COUNT(DISTINCT FirstName || '|' || LastName) AS UniqueNameCount FROM EmployeeName GROUP BY EmployeeID ORDER BY EmployeeID;
这里用|作为分隔符,确保不同的姓名组合拼接后不会重复,直接通过一次分组统计得到结果,写法更简洁。
两种方案都能得到你想要的结果:1|2、2|2、3|1,可以根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者user3726933
相关产品推荐
相关产品推荐

