You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

预期结果:

JOBEMPLOYEE_COUNT
Designer4
TRAINER4
Tester4
Manager2

示例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;

预期结果:

JOBAVG_SALARYMAX_SALARYTOTAL_SALARY
Designer3318.75500013275
TRAINER1975.0030007900
Tester1400.0016005600
Manager1050.0013002100

示例3:筛选员工数大于2的职位

如果需要过滤分组结果,记得用HAVING子句(它是对分组后的数据过滤,和针对原始行的WHERE区分开):

SELECT job, COUNT(*) AS employee_count
FROM emp
GROUP BY job
HAVING COUNT(*) > 2
ORDER BY employee_count DESC;

预期结果:

JOBEMPLOYEE_COUNT
Designer4
TRAINER4
Tester4

3. 关键注意事项

  • Oracle中分组查询的SELECT子句里,列要么是GROUP BY中的字段,要么被聚合函数(COUNT/AVG/SUM等)包裹,否则会触发语法错误。
  • 如果需要多维度分组(比如同时按job和deptno),只需要在GROUP BY中添加对应字段即可,例如:GROUP BY job, deptno。

内容的提问来源于stack exchange,提问作者steve jhone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:39:08