admin

我不明白为什么我的团队失败了

sql

SELECT ENAME, MAX(SAL), STORES.CITY
FROM EMPLOYEES
INNER JOIN STORES ON EMPLOYEES.STORE_ID = STORES.STORE_ID
GROUP BY EMPLOYEES.STORE_ID, STORES.CITY

DDL STORES

CREATE TABLE  "STORES" 
(   
    "STORE_ID" NUMBER NOT NULL ENABLE, 
    "CITY" VARCHAR2(50), 
     PRIMARY KEY ("STORE_ID")
     USING INDEX  ENABLE
)
/

DDL EMPLOYEES

CREATE TABLE  "EMPLOYEES" 
(   
    "EMPNO" NUMBER(4,0), 
    "ENAME" VARCHAR2(10), 
    "JOB" VARCHAR2(9), 
    "HIREDATE" DATE, 
    "SAL" NUMBER(7,2), 
    "COMM" NUMBER(7,2), 
    "STORE_ID" NUMBER
)
/

CREATE INDEX  "EMP_NAME_IDEX" ON  "EMPLOYEES" ("ENAME")
/

CREATE INDEX  "EMP_NAME_JOB_DATE_IDX" ON  "EMPLOYEES" ("ENAME", "JOB", "HIREDATE")
/

我试图获得一个新的视图,在这里我可以显示每个商店中薪水最高的员工的记录。

所需的输出:

  • 显示每个商店中TOP薪水最高的员工
  • STORE_ID-1个没有员工,因此不在报告中

像这样:

ENAME   JOB      STORE_ID   MAX(SAL)    CITY
------------------------------------------------------
ALLEN   SALESMAN    2        1600       New York City
KING    PRESIDENT   3        5000       Chicago
SCOTT   ANALYST     4        3000       Philadelphia

电流输出:

ENAME   JOB     STORE_ID    MAX(SAL)    CITY
------------------------------------------------------------
ALLEN   SALESMAN    2       1600    New York City
TURNER  SALESMAN    2       1500    New York City
WARD    SALESMAN    2       1250    New York City
MARTIN  SALESMAN    2       1250    New York City
KING    PRESIDENT   3       5000    Chicago
BLAKE   MANAGER     3       2850    Chicago
CLARK   MANAGER     3       2450    Chicago
SCOTT   ANALYST     4       3000    Philadelphia
FORD    ANALYST     4       3000    Philadelphia
JONES   MANAGER     4       2975    Philadelphia
MILLER  CLERK       4       1300    Philadelphia
ADAMS   CLERK       4       1100    Philadelphia
JAMES   CLERK       4        950    Philadelphia
SMITH   CLERK       4        800    Philadelphia

阅读 166

收藏
2021-07-01

共1个答案

admin

正如其他人已经解释的那样,“你不能吃蛋糕和吃它”。
您可以
某些内容分组,然后可以按原样返回它,也可以汇总一些内容。在您的情况下,您想按商店分组,即每个商店有一个单独的结果行(与内部联接条件匹配),而不是按员工。在这种情况下,必须汇总员工数据,其中包括姓名。
经典汇总会使用组中的所有条目,因此您将使用汇总中的所有员工姓名,这不是您想要的,因为您只想要薪水最高的员工。

幸运的是Oracle数据库确实有这样的情况下,一些(尽管可能不是全部),那就是KEEP聚集函数调节剂,其DENSE_RANKLAST/FIRST
这种结构允许对组中行的子集执行聚合,您KEEP在聚合中所处的位置FIRSTLAST在指定的排名中(基于给定的排序标准)。在您的情况下,您需要根据薪水标准对组内的雇员(商店的雇员)进行排序,这样,汇总将仅限于薪水最高的雇员。假设,即工资是唯一的值(他们通常不是),这会给你一个子组的一个员工,这样你就可以申请任何你想要的聚合(经常MAXMIN),并且仍然获得该名称。如果我们假设工资值不是唯一的,那么最高薪水可能不止一个员工-
首先是平局。在那种情况下,您可以在排名顺序中引入平局决胜方案(例如,薪水之后的次要条件可以是职位名称),也可以在汇总级别解决该问题(例如,通过选择MAXMIN员工姓名)。

总而言之,我们得到的是这样的:

SELECT MAX(e.ename)
         KEEP (DENSE_RANK FIRST ORDER BY e.sal DESC NULLS LAST, e.job) AS name,
       MIN(e.job)
         KEEP (DENSE_RANK FIRST ORDER BY e.sal DESC NULLS LAST, e.job) AS job,
       e.store_id,
       MAX(e.sal) AS salary,
       s.city
  FROM employees e
 INNER JOIN stores s ON e.store_id = s.store_id
 GROUP BY e.store_id, s.sity
2021-07-01