Oracle中如何按job字段进行分组查询
嘿,我来帮你搞定基于job列的分组查询需求!先把你的emp表结构和初始化数据整理成更清晰的格式,再给你几个实用的分组查询示例,涵盖常见的统计场景:
基于emp表job列的分组查询方案
1. 表结构与初始化数据
以下是可直接执行的表创建和数据插入SQL:
CREATE TABLE emp ( empno NUMBER(4) CONSTRAINT E_PK PRIMARY KEY, ename VARCHAR2(8), init VARCHAR2(5), job VARCHAR2(8), mgr NUMBER(4), bdate DATE, sal NUMBER(6,2), comm NUMBER(6,2), deptno NUMBER(2) DEFAULT 10 ); INSERT INTO emp VALUES(1,'Tom','N', 'TRAINER', 13,DATE '1965-12-17', 800 , NULL, 20); INSERT INTO emp VALUES(2,'Jack','JAM', 'Tester',6,DATE '1961-02-20', 1600, 300, 30); INSERT INTO emp VALUES(3,'Wil','TF' , 'Tester',6,DATE '1962-02-22', 1250, 500, 30); INSERT INTO emp VALUES(4,'Jane','JM', 'Designer', 9,DATE '1967-04-02', 2975, NULL, 20); INSERT INTO emp VALUES(5,'Mary','P', 'Tester',6,DATE '1956-09-28', 1250, 1400, 30); INSERT INTO emp VALUES(6,'Black','R', 'Designer', 9,DATE '1963-11-01', 2850, NULL, 30); INSERT INTO emp VALUES(7,'Chris','AB', 'Designer', 9,DATE '1965-06-09', 2450, NULL, 10); INSERT INTO emp VALUES(8,'Smart','SCJ', 'TRAINER', 4,DATE '1959-11-26', 3000, NULL, 20); INSERT INTO emp VALUES(9,'Peter','CC', 'Designer',NULL,DATE '1952-11-17', 5000, NULL, 10); INSERT INTO emp VALUES(10,'Take','JJ', 'Tester',6,DATE '1968-09-28', 1500, 0, 30); INSERT INTO emp VALUES(11,'Ana','AA', 'TRAINER', 8,DATE '1966-12-30', 1100, NULL, 20); INSERT INTO emp VALUES(12,'Jane','R', 'Manager', 6,DATE '1969-12-03', 800 , NULL, 30); INSERT INTO emp VALUES(13,'Fake','MG', 'TRAINER', 4,DATE '1959-02-13', 3000, NULL, 20); INSERT INTO emp VALUES(14,'Mike','TJA','Manager', 7,DATE '1962-01-23', 1300, NULL, 10);
2. 常用的job分组查询示例
示例1:统计每个职位的员工数量
这个查询能快速帮你了解各岗位的人员分布:
SELECT job, COUNT(*) AS employee_count FROM emp GROUP BY job ORDER BY employee_count DESC;
预期结果:
| JOB | EMPLOYEE_COUNT |
|---|---|
| Designer | 4 |
| TRAINER | 4 |
| Tester | 4 |
| Manager | 2 |
示例2:统计每个职位的薪资指标
如果要分析各岗位的薪资水平,可以用聚合函数计算平均、最高和总薪资:
SELECT job, ROUND(AVG(sal), 2) AS avg_salary, MAX(sal) AS max_salary, SUM(sal) AS total_salary FROM emp GROUP BY job ORDER BY avg_salary DESC;
预期结果:
| JOB | AVG_SALARY | MAX_SALARY | TOTAL_SALARY |
|---|---|---|---|
| Designer | 3318.75 | 5000 | 13275 |
| TRAINER | 1975.00 | 3000 | 7900 |
| Tester | 1400.00 | 1600 | 5600 |
| Manager | 1050.00 | 1300 | 2100 |
示例3:筛选员工数大于2的职位
如果需要过滤分组结果,记得用HAVING子句(它是对分组后的数据过滤,和针对原始行的WHERE区分开):
SELECT job, COUNT(*) AS employee_count FROM emp GROUP BY job HAVING COUNT(*) > 2 ORDER BY employee_count DESC;
预期结果:
| JOB | EMPLOYEE_COUNT |
|---|---|
| Designer | 4 |
| TRAINER | 4 |
| Tester | 4 |
3. 关键注意事项
- Oracle中分组查询的
SELECT子句里,列要么是GROUP BY中的字段,要么被聚合函数(COUNT/AVG/SUM等)包裹,否则会触发语法错误。 - 如果需要多维度分组(比如同时按
job和deptno),只需要在GROUP BY中添加对应字段即可,例如:GROUP BY job, deptno。
内容的提问来源于stack exchange,提问作者steve jhone
相关产品推荐
相关产品推荐

