Oracle: выдает ошибку в динамическом представлении - PullRequest
0 голосов
/ 21 мая 2018

У меня две таблицы, одна - сотрудник, другая - отдел.Я создаю динамическое представление, которое оценит все отделы по зарплате.Представление должно получать информацию от отдела и сотрудника, суммировать оклад по отделам и ранжировать отдел по окладам.

CREATE TABLE DEPARTMENT
(DEPARTMENT_ID NUMBER PRIMARY KEY,
DEPARTMENT_NAME VARCHAR(30) NOT NULL
);

CREATE TABLE JOBS
(JOB_ID NUMBER PRIMARY KEY,
JOB_TITLE VARCHAR(35) NOT NULL,
MIN_SALARY DECIMAL NOT NULL,
MAX_SALARY DECIMAL NOT NULL
);

CREATE TABLE EMPLOYEES
(EMPLOYEE_ID NUMBER PRIMARY KEY,
FIRST_NAME VARCHAR(20) NOT NULL,
LAST_NAME VARCHAR(25) NOT NULL,
EMAIL VARCHAR(25) NOT NULL,
PHONE_NUMBER VARCHAR(20) NOT NULL,
HIRE_DATE DATE NOT NULL,
JOB_ID NUMBER NOT NULL,
SALARY DECIMAL NOT NULL,
DEPARTMENT_ID NUMBER NOT NULL,
CONSTRAINT emp_job_fk FOREIGN KEY(JOB_ID) REFERENCES JOBS(JOB_ID),
CONSTRAINT emp_department_fk FOREIGN KEY(DEPARTMENT_ID) REFERENCES DEPARTMENT(DEPARTMENT_ID)
);

INSERT INTO DEPARTMENT (DEPARTMENT_ID,DEPARTMENT_NAME)
VALUES(1,'IT');
INSERT INTO DEPARTMENT (DEPARTMENT_ID,DEPARTMENT_NAME)
VALUES(2,'Sales');

INSERT INTO JOBS (JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY)
VALUES (1,'IT Administrator',250000.00,50000.00);
INSERT INTO JOBS (JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY)
VALUES (2,'Salesman',200000.00,40000.00);

Здесь я пока что создаю, но это дает мне ошибку

ORA-00979: не выражение GROUP BY 00979. 00000 - "не выражение GROUP BY"* Причина:
* Действие: Ошибка в строке: 4 Столбец: 9

Вот мой код

select department_id,department_name,total_salary 
from(

select  department_id,department_name, SALARY, count(*) as total_salary from(
select dep.department_id , dep.department_name ,emp.SALARY,
DENSE_RANK() OVER (PARTITION BY department_name ORDER BY salary)
from departments dep

inner join employees emp on dep.DEPARTMENT_ID = emp.DEPARTMENT_ID

)
GROUP BY SALARY)

1 Ответ

0 голосов
/ 22 мая 2018

Ваш запрос должен присоединиться к СОТРУДНИКАМ (чтобы получить зарплату) в DEPARTMENT (чтобы получить DEPARTMENT_NAME).Рассчитайте общую зарплату для каждого отдела на суммируя зарплаты сотрудникам, не считая их.В GROUP BY должны быть включены неагрегированные столбцы.

Затем необходимо ранжировать отделы по общей зарплате по отделам.Этот запрос ранжирует отделы с самой высокой зарплатой = 1. Он использует левое соединение для обслуживания отделов без сотрудников.

select department_id
       , department_name
       , total_salary
       , rank() over (order by total_salary desc) as dept_rank 
from (
     select  d.department_id
             , d.department_name
             , sum(e.SALARY)  as total_salary 
     from department d
          left join employees e
           on e.department_id = d.department_id 
      group by d.department_id
             , d.department_name
     )
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...