不使用GROUP BY实现查询至少参与2个项目的员工
解决方案:不使用GROUP BY实现员工项目数统计
要实现原SQL(统计参与项目数>1的员工ID及对应项目数)且不使用GROUP BY,可以用以下两种方法:
方法1:关联子查询+去重过滤
SELECT DISTINCT rp.idEmploye, (SELECT COUNT(*) FROM ressourcesprojet_ WHERE idEmploye = rp.idEmploye) AS nbrProjet FROM ressourcesprojet_ rp WHERE (SELECT COUNT(*) FROM ressourcesprojet_ WHERE idEmploye = rp.idEmploye) > 1;
- 用
DISTINCT避免同一员工因多条项目记录重复出现 - 子查询通过员工ID关联,统计该员工的总项目数,再通过
WHERE过滤掉项目数≤1的记录
方法2:窗口函数(推荐,效率更高)
如果你的数据库支持窗口函数(如MySQL 8.0+、PostgreSQL、SQL Server等),可以用COUNT() OVER()实现分组统计,无需GROUP BY:
SELECT DISTINCT idEmploye, nbrProjet FROM ( SELECT idEmploye, COUNT(*) OVER(PARTITION BY idEmploye) AS nbrProjet FROM ressourcesprojet_ ) AS temp WHERE nbrProjet > 1;
- 内层查询用窗口函数按
idEmploye分组统计项目数,外层过滤出符合条件的记录并去重
对你尝试语句的问题分析
- 第一条语句完全偏离需求,关联的是
EtapexProjet和Projet表,和员工项目数统计无关 - 第二条语句返回了所有员工(包括项目数为0或1的),只需添加
WHERE nbrProjet > 1即可过滤,但会包含无项目的员工(显示nbrProjet为0),建议从ressourcesprojet_而非employe_取数避免这种情况 - 第三条语句的子查询条件
idEmploye = idEmploye是同列自比较,相当于全表计数,导致所有员工都被选中,需要给外层表加别名,比如WHERE 1 < (SELECT COUNT(idProjet) FROM ressourcesprojet_ where idEmploye = rp.idEmploye),再配合DISTINCT去重
内容的提问来源于stack exchange,提问作者Lithio3D
相关产品推荐
相关产品推荐

