2015-10-11 15 views
0

Мне нужна помощь. У меня есть стол сотрудников и отделы стола. И мне нужно получить отдел, у которого самая большая сумма зарплат. Я стараюсь это:SQL - Как получить MAX SUM?

SELECT department_name,MAX(sum_salary) as sum_salary 
FROM (SELECT department_name,SUM(salary) AS sum_salary 
FROM EMPLOYEES,DEPARTMENTS 
WHERE DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID 
GROUP BY DEPARTMENT_NAME) 
GROUP BY DEPARTMENT_NAME; 

Но результат список отделов, а не только одно значение.

Благодарим за помощь!

+0

Какой dbms? sql-server, mysql или? Кстати, ваш запрос не имеет смысла. – RubahMalam

+0

Это sql от oracle –

ответ

0

Если в случае связей вам нужен только один, то order by и какая-то форма получения одной строки работает. Стандартный метод ANSI является:

SELECT d.DEPARTMENT_NAME, SUM(e.salary) AS sum_salary 
FROM EMPLOYEES e JOIN 
    DEPARTMENTS d 
    ON d.DEPARTMENT_ID = e.DEPARTMENT_ID 
GROUP BY d.DEPARTMENT_NAME 
ORDER BY SUM(e.salary) DESC 
FETCH FIRST 1 ROW ONLY; 

Обратите внимание на использование надлежащих JOIN синтаксиса и таблицы псевдонимов.

РЕДАКТИРОВАТЬ:

Oracle 12g поддерживает синтаксис выше. Вы можете сделать это в более ранних версиях, как:

SELECT t.* 
FROM (SELECT d.DEPARTMENT_NAME, SUM(e.salary) AS sum_salary 
     FROM EMPLOYEES e JOIN 
      DEPARTMENTS d 
      ON d.DEPARTMENT_ID = e.DEPARTMENT_ID 
     GROUP BY d.DEPARTMENT_NAME 
     ORDER BY SUM(e.salary) DESC 
    ) t 
WHERE rownum = 1; 

Here's SQL-Скрипки.

+0

Не вернет ли это сумма минимальной суммы зарплат? Я предполагаю, что unqualified 'order by' возрастает, как в T-SQL. –

+0

О, боже, очень хорошая идея. Спасибо!!!! –

+0

Я сделал это точно так же, как вы, и ответ таков: команда SQL не была закончена: -/ –

1
select 
    min(max(department_name)) keep (dense_rank last order by sum(salary)) 
    as department_name, 
    min(sum(salary)) keep (dense_rank last order by sum(salary)) 
    as sum_salary 
from EMPLOYEES join DEPARTMENTS using(department_id) 
group by department_id 

fiddle

0

Подождите, - есть еще один способ:

WITH SUM_SAL AS (SELECT d.DEPARTMENT_NAME, SUM(e.SALARY) AS SUM_SALARY 
        FROM EMPLOYEES e 
        INNER JOIN DEPARTMENTS d 
        ON d.DEPARTMENT_ID = e.DEPARTMENT_ID 
        GROUP BY DEPARTMENT_NAME), 
    MAX_SAL AS (SELECT MAX(SUM_SALARY) AS MAX_SALARY 
        FROM SUM_SAL) 
SELECT s.DEPARTMENT_NAME, m.MAX_SALARY 
    FROM SUM_SAL s 
    INNER JOIN MAX_SAL m 
    ON m.MAX_SALARY = s.SUM_SALARY; 

SQLFiddle here

удачи.