使用 Joins 和 Over 子句在 SQL 中组合聚合值和非聚合值
先决条件 - SQL 中的聚合函数,SQL 中的联接
聚合函数对一组值执行计算并返回单个值。现在,考虑具有以下结构的员工表 EMP 和部门表 DEPT:
表 -员工表Name Null Type EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7, 2) COMM NUMBER(7, 2) DEPTNO NUMBER(2)
表 -部门表Name Null Type DEPTNO NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)
并且需要以下结果:
- 显示 EMP 的名称、SAL、工作以及从事相同工作的 EMPS 的 MAX、MIN、AVG、总 SAL。
- 显示部门名称以及其中工作的 EMP 数量。
聚合值不能直接与非聚合值一起使用以获得结果。因此可以使用以下概念:
1. 使用连接 –
- 创建一个包含聚合值结果的子表。
- 使用 Join,使用来自子表的结果以非聚合值显示它们。
使用 JOIN 解决问题 1:
SELECT ENAME, SAL, EMP.JOB,
SUBTABLE.MAXSAL, SUBTABLE.MINSAL,
SUBTABLE.AVGSAL, SUBTABLE.SUMSAL
FROM EMP
INNER JOIN
(SELECT JOB, MAX(SAL) MAXSAL, MIN(SAL)
MINSAL, AVG(SAL) AVGSAL, SUM(SAL) SUMSAL
FROM EMP
GROUP BY JOB) SUBTABLE
ON EMP.JOB = SUBTABLE.JOB;
样本数据的输出:Ename Sal Job MaxSal MinSal AvgSal SumSal SCOTT 3300 ANALYST 3300 1925 2841.67 8525 HENRY 1925 ANALYST 3300 1925 2841.67 8525 FORD 3300 ANALYST 3300 1925 2841.67 8525 SMITH 3300 CLERK 3300 1045 1746.25 6985 MILLER 1430 CLERK 3300 1045 1746.25 6985
2. 使用“结束”子句——
- OVER CLAUSE 连同 PARTITION BY 用于将数据分解为分区。
- 指定的功能适用于每个分区。
使用 OVER 子句解决问题 2:
SELECT DISTINCT(DNAME),
COUNT(ENAME) OVER (PARTITION BY EMP.DEPTNO) EMP
FROM EMP
RIGHT OUTER JOIN DEPT
ON EMP.DEPTNO=DEPT.DEPTNO
ORDER BY EMP DESC;
Dname | Emp |
---|---|
SALES | 6 |
RESEARCH | 5 |
ACCOUNTING | 3 |
OPERATIONS | 0 |
OTHERS | 0 |