使用Oracle在SQL中跨多个表聚合
我是SQL新手,一直在使用聚合函数处理复杂的多重连接 以下是我正在寻找的结果集: 编写查询以显示具有薪资等级(最低)的部门名称, 最低工资和平均佣金。对于具有空值的部门 佣金,您应该显示0。(等级表可用于 获得工资等级) 我有三张桌子:使用Oracle在SQL中跨多个表聚合,sql,oracle,join,aggregate-functions,Sql,Oracle,Join,Aggregate Functions,我是SQL新手,一直在使用聚合函数处理复杂的多重连接 以下是我正在寻找的结果集: 编写查询以显示具有薪资等级(最低)的部门名称, 最低工资和平均佣金。对于具有空值的部门 佣金,您应该显示0。(等级表可用于 获得工资等级) 我有三张桌子: emp-代表员工、他们的姓名、相关部门和 薪水 部门-表示部门及其关联的标题和位置 salgrade-表示多个薪资范围 以下是表格说明和数据集: SQL> desc emp Name Null? Typ
- emp-代表员工、他们的姓名、相关部门和 薪水
- 部门-表示部门及其关联的标题和位置
- salgrade-表示多个薪资范围
SQL> desc emp
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME CHAR(10)
JOB CHAR(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NOT NULL NUMBER(2)
SQL> select empno, ename, sal, deptno from emp;
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7839 KING 5000 10
7698 BLAKE 2850 30
7782 CLARK 2450 10
7566 JONES 2975 20
7654 MARTIN 1250 30
7499 ALLEN 1600 30
7844 TURNER 1500 30
7900 JAMES 950 30
7521 WARD 1250 30
7902 FORD 3000 20
7369 SMITH 800 20
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7788 SCOTT 3000 20
7876 ADAMS 1100 20
7934 MILLER 1300 10
1456 JOHN SMITH 3000 20
15 rows selected.
SQL> desc dept
Name Null? Type
----------------------------------------- -------- ----------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME CHAR(14)
LOC CHAR(13)
SQL> select * from dept
2 ;
DEPTNO DNAME LOC
---------- -------------- -------------
50 TRAINING SAN FRANCISCO
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> desc salgrade;
Name Null? Type
----------------------------------------- -------- ----------------------------
GRADE NUMBER
LOSAL NUMBER
HISAL NUMBER
SQL> select * from salgrade;
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
Salgrade表的DDL:
CREATE TABLE SALGRADE (
GRADE NUMBER,
LOSAL NUMBER,
HISAL NUMBER);
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
我写了下面的查询,但我正在努力计算每个部门的最低成绩。我将如何实现这一点
以下是我到目前为止所做的(我已经复制了MIN()函数,以提供愚蠢的数据,从而返回一个没有错误的结果):
请提供一个简短的解释,以便我能够增长我的SQL知识,并理解任何响应。提前感谢您的帮助!:) 您需要使用以下连接方式连接到
SALGRADE
表:
SELECT dt.*,
sg.GRADE AS "SALARY GRADE"
FROM
(
SELECT d.dname AS "DEPARTMENT",
MIN(NVL(e.sal,0)) AS "MINIMUM_SALARY",
AVG(NVL(e.comm,0)) AS "AVERAGE COMMISSION"
FROM dept d
LEFT JOIN emp e
ON d.deptno = e.deptno
GROUP BY
d.dname, d.deptno
) dt
JOIN SALGRADE sg
ON "MINIMUM_SALARY" BETWEEN sg.LOWSAL AND sg.HIGHSAL
ORDER BY dt.deptno ASC
备注:
- 您不需要完全连接,只需左键即可
- 如果工资低于最低工资范围,您可能会将第二次加入也更改为左侧
salgrade
表的DDL吗?可以,没问题。我已经添加了它,这就是你的意思吗?我刚刚使用SQL*Plus:Release 11.2.0.1.0 Production在sqlplus中尝试了该查询,并收到一个错误:FROM(选择d.dname作为“DEPARTMENT”,*第3行错误:ORA-00936:缺少表达式感谢您的快速响应此查询应按原样运行。您的查询中似乎有一个*
错误位置:-)我不得不做一些细微的更改以获得我想要的确切结果,但您的回答非常好。谢谢
SELECT dt.*,
sg.GRADE AS "SALARY GRADE"
FROM
(
SELECT d.dname AS "DEPARTMENT",
MIN(NVL(e.sal,0)) AS "MINIMUM_SALARY",
AVG(NVL(e.comm,0)) AS "AVERAGE COMMISSION"
FROM dept d
LEFT JOIN emp e
ON d.deptno = e.deptno
GROUP BY
d.dname, d.deptno
) dt
JOIN SALGRADE sg
ON "MINIMUM_SALARY" BETWEEN sg.LOWSAL AND sg.HIGHSAL
ORDER BY dt.deptno ASC