2016-04-07 5 views
0

FRAGE: Schreiben Sie eine SQL SELECT-Anweisung, um den Namen und die Adresse aller Abteilungen (mit Ausnahme der Abteilungen in Dallas) anzuzeigen, die die maximale Anzahl an Mitarbeitern haben. Sortieren Sie Ihre Ausgabe in aufsteigender Reihenfolge nach Abteilungsname.SQL-Entwickler Abfrage

Erstellen der Abteilungs Tabelle

CREATE TABLE department 
(DEPARTMENT_ID   NUMBER(4)  PRIMARY KEY, 
DEPARTMENT_NAME  VARCHAR2(20) NOT NULL UNIQUE, 
ADDRESS    VARCHAR2(20) NOT NULL); 

Bestücken Abteilung Tabelle

INSERT INTO department VALUES(10, 'ACCOUNTING', 'NEW YORK'); 
INSERT INTO department VALUES(20, 'RESEARCH', 'DALLAS'); 
INSERT INTO department VALUES(30, 'SALES', 'CHICAGO'); 
INSERT INTO department VALUES(40, 'IT', 'DALLAS'); 
INSERT INTO department VALUES(50, 'EXECUTIVE', 'NEW YORK'); 
INSERT INTO department VALUES(60, 'MARKETING', 'CHICAGO'); 
COMMIT; 

Erstellen von Mitarbeiter Tabelle

CREATE TABLE employee 
(EMPLOYEE_ID NUMBER(4)  PRIMARY KEY, 
EMPLOYEE_NAME VARCHAR2(20) NOT NULL, 
JOB   VARCHAR2(50) NOT NULL, 
MANAGER_ID NUMBER(4), 
HIRE_DATE  DATE   NOT NULL, 
SALARY  NUMBER(9, 2) NOT NULL, 
COMMISSION NUMBER(9, 2), 
DEPARTMENT_ID NUMBER(4) REFERENCES department(DEPARTMENT_ID)); 

Bestücken Mitarbeiter Tabelle

INSERT INTO employee 
VALUES(7839, 'KING', 'PRESIDENT', NULL, '20-NOV-01', 5000, NULL, 50); 
INSERT INTO employee 
VALUES(7596, 'JOST', 'VICE PRESIDENT', 7839, '04-MAY-01', 4500, NULL, 50); 
INSERT INTO employee 
VALUES(7603, 'CLARK', 'VICE PRESIDENT', 7839, '12-JUN-01', 4000, NULL, 50); 
INSERT INTO employee 
VALUES(7566, 'JONES', 'PUBLIC ACCOUNTANT', 7596, '05-APR-01', 3000, NULL,   10); 
INSERT INTO employee 
VALUES(7886, 'STEEL', 'PUBLIC ACCOUNTANT', 7566, '08-MAR-03', 2500, NULL, 10); 
INSERT INTO employee 
VALUES(7610, 'WILSON', 'ANALYST', 7596, '03-DEC-01', 3000, NULL, 20); 
INSERT INTO employee 
VALUES(7999, 'WOLFE', 'ANALYST', 7610, '15-FEB-02', 2500, NULL, 20); 
INSERT INTO employee 
VALUES(7944, 'LEE', 'ANALYST', 7610, '04-SEP-06', 2400, NULL, 20); 
INSERT INTO employee 
VALUES(7900, 'FISHER', 'SALESMAN', 7603, '06-DEC-01', 3000, 500, 30); 
INSERT INTO employee 
VALUES(7921, 'JACKSON', 'SALESMAN', 7900, '25-FEB-05', 2500, 400, 30); 
INSERT INTO employee 
VALUES(7952, 'LANCASTER', 'SALESMAN', 7900, '06-DEC-06', 2000, 150, 30); 
INSERT INTO employee 
VALUES(7910, 'SMITH', 'DATABASE ADMINISTRATOR', 7596, '20-DEC-01', 2900,  NULL, 40); 
INSERT INTO employee 
VALUES(7788, 'SCOTT', 'PROGRAMMER', 7910, '15-JAN-03', 2500, NULL, 40); 
INSERT INTO employee 
VALUES(7876, 'ADAMS', 'PROGRAMMER', 7910, '15-JAN-03', 2000, NULL, 40); 
INSERT INTO employee 
VALUES(7934, 'MILLER','PROGRAMMER', 7876, '25-JAN-02', 1000, NULL, 40); 
INSERT INTO employee 
VALUES(8000, 'BREWSTER', 'TBA', NULL, '22-AUG-13', 2500, NULL, NULL); 
COMMIT; 

Die Abfrage, die ich schrieb, ist unten und es funktioniert perfekt bei der Suche nach der maximalen Anzahl von Mitarbeitern in DALLAS Abteilung, aber ich möchte DALLAS zu beseitigen und finden Sie die andere Abteilung, die die MAXIMALE Anzahl der Mitarbeiter arbeitet, die durch die Daten ist sind (CHICAGO und NEW YORK). Kann mir bitte jemand helfen?

SELECT d.department_id, d.department_name, COUNT(*) 
FROM  department d 
INNER JOIN employee e 
ON  d.department_id = e.department_id 
GROUP BY d.department_id, d.department_name 
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) 
FROM  employee 
GROUP BY department_id) 
ORDER BY department_id; 

Antwort

0

Sie können einen Rang analytische Funktion verwenden:

select * 
from (
    select department_id, department_name, rank() over (order by cnt desc) rnk 
    from(
     SELECT d.department_id, d.department_name, COUNT(*) cnt 
     FROM  department d 
     INNER JOIN employee e 
     ON  d.department_id = e.department_id 
     GROUP BY d.department_id, d.department_name 
    ) 
) 
where rnk = 2 --here you may change to what position you want 
; 
1

Kriterien:

SELECT d.department_id, d.department_name, COUNT(*) 
FROM  department d 
INNER JOIN employee e 
ON  d.deptartment_id = e.department_id 
where d.address != 'DALLAS' 
GROUP BY d.department_id, d.department_name 
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) 
FROM  employee 
where department_id not in (select department_id from department where address = 'DALLAS') 
GROUP BY department_id) 
ORDER BY department_id; 

;

+0

Vielen Dank –

Verwandte Themen