2015-02-04 2 views
0

Я пытаюсь написать запрос sql, чтобы выяснить, сколько зарплат увеличилось за последний год для каждого отдела из-за новых сотрудников.Вычитание многострочных запросов

структура таблицы сотрудников (EMPNO, DEPTNO, МСДТ, HireDate)

Я могу понять, как получить все зарплаты по отделам

SELECT sum(msal) FROM employees GROUP BY deptno; 

и как получить зарплату от людей, которые были нанятый в прошлом году

SELECT sum(msal) FROM employees WHERE hiredate > (DATEADD(year, -1, GETDATE())) GROUP BY deptno; 

Но каким бы способом я ни старался вычитать результат этих двух запросов, я получаю ошибки.

+0

Возможно, вам стоит показать ошибки? – OldProgrammer

ответ

2

Вот что вы можете сделать. В этом случае я использую CASE заявление для фильтрации новых сотрудников:

SELECT SUM(msal) - SUM(CASE WHEN hiredate > ADD_MONTHS(SYSDATE, -12) THEN msal ELSE 0 END) 
    FROM employees 
GROUP BY deptno; 

FYI, Oracle не имеет DATEADD() функцию и не имеет GETDATE() функцию. Обратите внимание, что я использовал ADD_MONTHS() и SYSDATE (вы также можете использовать CURRENT_DATE) вместо них.

+0

Это очень элегантное решение! Спасибо. Я знаю, что у Oracle нет DATEADD или GETDATE(), но я пытался играть с надстройками в MySQL, и мой ум застрял на нем. Предположим, что кто-то должен был нормализовать и разорвать зарплату в другую таблицу, как бы выглядел запрос? –

+0

Вы имеете в виду зарплаты в таблице отдельно от сотрудников? Измените свой вопрос тем, что вы имеете в виду, и я попытаюсь отредактировать свой ответ. –

1

Почему бы не просто изменить направление where?

SELECT sum(msal) 
FROM employees 
WHERE hiredate <= DATEADD(year, -1, GETDATE()) 
GROUP BY deptno; 

Кроме того, как правило, когда вы агрегировать полем, то поле (deptno) входит в п select.

Смежные вопросы