2016-04-07 35 views
0

SORU: Maksimum sayıda çalışanı olan tüm bölümlerin (Dallas'taki bölümler hariç) adını ve adresini görüntülemek için bir SQL SELECT ifadesi yazın. Çıktınızı departman adına göre artan sıraya göre sıralayın.SQL geliştirici Sorgu

Bölümü Tablo

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

doldururken Bölümü tablo oluşturma Çalışan Tablo oluşturma

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; 

Çalışan Tablo Populated

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)); 

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; 

Yazdığım Sorgu aşağıda ve DALLAS departmanında azami çalışan sayısını bulmak için mükemmel bir şekilde çalışıyor ancak DALLAS'ı ortadan kaldırmak ve MAXIMUM çalışan sayısı olan diğer departmanı bulmak ve verilerde bulunan diğer departmanı bulmak istiyorum. (CHICAGO ve NEW YORK). Biri lütfen bana yardım edebilir mi?

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; 

cevap

0

Bir rütbe analitik işlevi kullanabilirsiniz: Sorgunuzla kullanma

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

:

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

Teşekkür ederim Çok –