📜  使用 Joins 和 Over 子句在 SQL 中组合聚合值和非聚合值

📅  最后修改于: 2022-05-13 01:54:44.251000             🧑  作者: Mango

使用 Joins 和 Over 子句在 SQL 中组合聚合值和非聚合值

先决条件 - SQL 中的聚合函数,SQL 中的联接
聚合函数对一组值执行计算并返回单个值。现在,考虑具有以下结构的员工表 EMP 和部门表 DEPT:

表 -员工表

NameNullType
EMPNONOT NULLNUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7, 2)
COMM NUMBER(7, 2)
DEPTNO NUMBER(2)

表 -部门表

NameNullType
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)

并且需要以下结果:

  1. 显示 EMP 的名称、SAL、工作以及从事相同工作的 EMPS 的 MAX、MIN、AVG、总 SAL。
  2. 显示部门名称以及其中工作的 EMP 数量。

聚合值不能直接与非聚合值一起使用以获得结果。因此可以使用以下概念:

1. 使用连接 –

  1. 创建一个包含聚合值结果的子表。
  2. 使用 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; 

样本数据的输出:

EnameSalJobMaxSalMinSalAvgSalSumSal
SCOTT3300ANALYST330019252841.678525
HENRY1925ANALYST330019252841.678525
FORD3300ANALYST330019252841.678525
SMITH3300CLERK330010451746.256985
MILLER1430CLERK330010451746.256985

2. 使用“结束”子句——

  1. OVER CLAUSE 连同 PARTITION BY 用于将数据分解为分区。
  2. 指定的功能适用于每个分区。

使用 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; 
DnameEmp
SALES6
RESEARCH5
ACCOUNTING3
OPERATIONS0
OTHERS0