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:
STORES
CREATE TABLE "STORES" ( "STORE_ID" NUMBER NOT NULL ENABLE, "CITY" VARCHAR2(50), PRIMARY KEY ("STORE_ID") USING INDEX ENABLE ) /
DDL EMPLOYEES:
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") /
我试图获得一个新的视图,在这里我可以显示每个商店中薪水最高的员工的记录。
所需的输出:
像这样:
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
正如其他人已经解释的那样,“你不能吃蛋糕和吃它”。 您可以 按 某些内容分组,然后可以按原样返回它,也可以汇总一些内容。在您的情况下,您想按商店分组,即每个商店有一个单独的结果行(与内部联接条件匹配),而不是按员工。在这种情况下,必须汇总员工数据,其中包括姓名。 经典汇总会使用组中的所有条目,因此您将使用汇总中的所有员工姓名,这不是您想要的,因为您只想要薪水最高的员工。
幸运的是Oracle数据库确实有这样的情况下,一些(尽管可能不是全部),那就是KEEP聚集函数调节剂,其DENSE_RANK和LAST/FIRST。 这种结构允许对组中行的子集执行聚合,您KEEP在聚合中所处的位置FIRST或LAST在指定的排名中(基于给定的排序标准)。在您的情况下,您需要根据薪水标准对组内的雇员(商店的雇员)进行排序,这样,汇总将仅限于薪水最高的雇员。假设,即工资是唯一的值(他们通常不是),这会给你一个子组的一个员工,这样你就可以申请任何你想要的聚合(经常MAX或MIN),并且仍然获得该名称。如果我们假设工资值不是唯一的,那么最高薪水可能不止一个员工- 首先是平局。在那种情况下,您可以在排名顺序中引入平局决胜方案(例如,薪水之后的次要条件可以是职位名称),也可以在汇总级别解决该问题(例如,通过选择MAX或MIN员工姓名)。
KEEP
DENSE_RANK
LAST
FIRST
MAX
MIN
总而言之,我们得到的是这样的:
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