【问题标题】:find emp_names,max,min salary and number of employees on each department?找到每个部门的 emp_names、max、min 工资和员工人数?
【发布时间】:2019-03-30 14:42:39
【问题描述】:

我使用 oracle 11g,所以我有 2 个表(员工、部门):

desc employees:      desc departments

 EMPLOYEE_ID        DEPARTMENT_ID
 FIRST_NAME         DEPARTMENT_NAME
 LAST_NAME          MANAGER_ID
 EMAIL              LOCATION_ID
 PHONE_NUMBER
 HIRE_DATE
 JOB_ID
 SALARY
 COMMISSION_PCT
 MANAGER_ID
 DEPARTMENT_ID

我想得到

employee_name,emp_names,emp_salary,dep_id,dep_names,每个人的最高工资 部门,每个部门的最低工资,以及每个部门的雇员人数 部门。

所以我这样做了:

 select FIRST_NAME,DEPARTMENT_ID,max(SALARY),min(SALARY),count(EMPLOYEE_ID)
from employees join departments on employees.department_id = departments.departm
ent_id group by first_name,department_id;

但它给出了一个错误:

第 1 行出现错误:ORA-00918:列定义不明确

但是我的 sql 查询正确吗?

【问题讨论】:

  • emp_names 应该在这里是什么,您能通过示例数据向我们展示一下吗?
  • 问题本身没有意义。如果您想要每个部门的最高工资,那么您必须单独按 DEPARTMENT_ID 分组,而不是按 FIRST_NAME 和 DEPARTMENT_ID 分组。很好,但是你应该为 EMP_NAMES 显示什么?在同一个查询中按部门显示 FIRST_NAME 和 max(SALARY) 是没有意义的。请你的老师澄清。也许他们想要一个单一的、以逗号分隔的部门中所有姓名的列表,在一个字符串中?
  • @mathguy,@tim emp_names is first_name for employee ,你的意思是我的整个代码都无效???
  • 正如目前所写的那样,代码是无效的,因为在 GROUP BY 中,您给出了两个表中都存在的列的名称。您必须使用表名限定该列名。然后,您将在 SELECT 子句中收到相同的错误(出于相同的原因,并以相同的方式修复它)。之后查询将起作用,但它会给你错误的答案,因为你是按名字和部门 ID 分组的 - 所以你会得到,例如,在部门 50 工作的所有名为 JOHN 的员工的最高薪水. 查询是“有效的”,但不能正确解决您的问题。

标签: sql oracle ora-00918


【解决方案1】:

我没有你的表,所以我从 Scott 的表中创建了视图,以模拟你所拥有的。

SQL> create or replace view employees as
  2    select empno  employee_id,
  3           ename  last_name,
  4           deptno department_id,
  5           sal    salary
  6    from emp;

View created.

SQL> create or replace view departments as
  2    select deptno department_id,
  3           dname  department_name
  4    from dept;

View created.

SQL>

我是这样理解这个问题的:每个部门的员工名单应该与其他人分开(最小值、最大值、计数)。

所以:员工名单:

SQL> select d.department_name, e.last_name
  2  from departments d join employees e on d.department_id = e.department_id
  3  order by d.department_name;

DEPARTMENT_NAM LAST_NAME
-------------- ----------
ACCOUNTING     CLARK
ACCOUNTING     KING
ACCOUNTING     MILLER
RESEARCH       JONES
RESEARCH       FORD
RESEARCH       ADAMS
RESEARCH       SMITH
RESEARCH       SCOTT
SALES          WARD
SALES          TURNER
SALES          ALLEN
SALES          JAMES
SALES          BLAKE
SALES          MARTIN

14 rows selected.

聚合:没有任何员工的部门的外部联接:

SQL> select d.department_name,
  2    min(e.salary) min_sal,
  3    max(e.salary) max_sal,
  4    count(e.employee_id) cnt_emp
  5  from departments d left join employees e on d.department_id = e.department_id
  6  group by d.department_name
  7  order by d.department_name;

DEPARTMENT_NAM    MIN_SAL    MAX_SAL    CNT_EMP
-------------- ---------- ---------- ----------
ACCOUNTING           1300       5000          3
OPERATIONS                                    0
RESEARCH              800       3000          5
SALES                 950       2850          6

LISTAGG 允许您在同一语句中列出每个部门的所有员工;请参见第 5 行。不知何故,我怀疑您是否了解过该功能(当您遇到这样的问题时)。

SQL> select d.department_name,
  2    min(e.salary) min_sal,
  3    max(e.salary) max_sal,
  4    count(e.employee_id) cnt_emp,
  5    listagg(e.last_name, ', ') within group (order by e.last_name) employees
  6  from departments d left join employees e on d.department_id = e.department_id
  7  group by d.department_name
  8  order by d.department_name;

DEPARTMENT_NAM    MIN_SAL    MAX_SAL    CNT_EMP EMPLOYEES
-------------- ---------- ---------- ---------- -------------------------------------------
ACCOUNTING           1300       5000          3 CLARK, KING, MILLER
OPERATIONS                                    0
RESEARCH              800       3000          5 ADAMS, FORD, JONES, SCOTT, SMITH
SALES                 950       2850          6 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD

SQL>

【讨论】:

  • 用于测试 - 这些表是 HR 架构中的表(类似于 SCOTT 的标准 Oracle 架构,但包含更多数据、索引等)您可能需要检查是否它已经安装在您的系统上;否则您可能需要安装它,因为它在 Oracle 文档中的许多示例中都有使用。
猜你喜欢
  • 2021-01-31
  • 2019-06-23
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多