JOBNAME表查询字段并关联职位统计报错,求正确SQL写法
正确SQL实现需求分析
问题背景
现有表JOBNAME,结构及数据如下:
| Job | Name |
|---|---|
| 工程师 | Alex |
| 工程师 | Frank |
| SDE | John |
| SDE | Frank |
| SDE | Mason |
期望查询结果为每个员工记录后添加对应Job的总人数:
| Job | Name | Job Count |
|---|---|---|
| 工程师 | Alex | 2 |
| 工程师 | Frank | 2 |
| SDE | John | 3 |
| SDE | Frank | 3 |
| SDE | Mason | 3 |
用户原SQL语句:
select job, name, count(job) as 'Job Count' from JOBNAME group by count(job)
错误原因
原SQL的核心错误在于GROUP BY count(job):
- GROUP BY子句必须指定非聚合的列,不能直接使用聚合函数作为分组依据
- 这种分组方式会丢失原始表中的
job和name明细记录,无法满足保留所有员工行的需求
正确解决方案
方法1:使用窗口函数(推荐,简洁高效)
利用COUNT() OVER (PARTITION BY job)窗口函数,直接计算每个Job分组的总人数,同时保留所有原始行:
SELECT job, name, COUNT(job) OVER (PARTITION BY job) AS `Job Count` FROM JOBNAME;
方法2:子查询关联
先统计每个Job的总人数,再通过job字段关联回原表:
SELECT j.job, j.name, job_counts.job_count AS `Job Count` FROM JOBNAME j JOIN ( SELECT job, COUNT(*) AS job_count FROM JOBNAME GROUP BY job ) job_counts ON j.job = job_counts.job;
两种方法都能得到期望的结果,窗口函数写法更简洁,适合大多数现代数据库(如MySQL 8.0+、PostgreSQL、SQL Server等);子查询方法兼容性更强,可支持低版本数据库。
内容的提问来源于stack exchange,提问作者apadia
相关产品推荐
相关产品推荐

