2015-02-04 5 views
0

저는 신입 사원으로 인해 각 부서에서 지난해에 얼마나 많은 봉급이 인상되었는지 계산하는 SQL 쿼리를 작성하려고합니다.복수 행 쿼리 빼기

테이블 구조는 종업원 나는 부서

SELECT sum(msal) FROM employees GROUP BY deptno; 

하고 있었다 사람들의 급여를 얻을 수있는 방법으로 모든 급여를 얻는 방법을 알아낼 수

(EMPNO, DEPTNO, msal, HIREDATE)입니다 작년에 고용 된

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

하지만이 두 쿼리의 결과를 빼내려고하면 오류 만 발생합니다.

+0

오류를 표시해야합니까? – OldProgrammer

답변

2

다음은 사용자가 수행 할 수있는 작업입니다.

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

가 참고로, 오라클은 DATEADD() 기능이없는 않으며는 GETDATE() 기능을 가지고 않습니다이 경우 나는 신입 사원을 필터링 할 CASE 문을 사용하고 있습니다. 이 대신에 ADD_MONTHS()SYSDATE ( CURRENT_DATE을 사용할 수도 있음)을 사용했음을 유의하십시오.

+0

그건 아주 우아한 해결책입니다! 고맙습니다. 나는 오라클에 DATEADD 나 GETDATE()가 없다는 것을 알고 있지만, MySQL에서 substractions를 가지고 놀려고 노력하고 있었고, 마음이 고생했다. 누군가가 급여를 다른 테이블로 정규화하고 중단한다고 가정 할 때 쿼리는 어떻게 보이나요? –

+0

직원이 아닌 테이블에 급여가 있습니까? 당신이 염두에두고있는 것을 가지고 질문을 편집하면 내 대답을 편집하려고 노력할 것입니다. –

1

where의 방향을 바꾸지 않는 이유는 무엇입니까? 당신이 필드를 기준으로 집계 할 때 또한

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

는, 일반적으로, 다음 필드 (deptno)는 select 절에 포함되어 있습니다.