2012-06-02 7 views
2

두 테이블 tblEmployeetblEmpSalary이 있다고 가정합니다. 모든 직원의 이름, 급여, 각 부서에서 가장 높은 급여를받는 사람의 목록을 얻으려면 SQL 문을 작성해야합니다.두 테이블의 특정 열 선택

샘플 테이블 데이터가 여기에 있습니다 :

enter image description here

답변

2
SELECT e.strEmpName, s.monSalary 
FROM tblEmployee e 
JOIN tblEmpSalary s ON e.intEmployeeID = s.intEmployeeID 
WHERE e.strDepartment + '-' + CAST(s.monSalary AS varchar(20)) IN (
    SELECT e2.strDepartment + '-' + CAST(MAX(s2.monSalary) AS varchar(20)) 
    FROM tblEmployee e2 
    JOIN tblEmpSalary s2 ON e2.intEmployeeID = s2.intEmployeeID 
    GROUP BY e2.strDepartment) 

면책 조항 : 잘못 몇 가지 작은 세부 사항을 가질 수 있도록 나는 지금이 쿼리를 테스트 할 수 없습니다. 동일한 최대 급여와 두 개 이상의 직원의 경우

+0

안녕하세요 @ 파블로 좋은 소리지만 'varchar 값'C++ - '을 데이터 유형 int'로 변환 할 때 오류가 발생했습니다. 부서 ID가 없으며 부서명 만 있습니다. – yeasir007

+0

@ yeasir007 그래, 내가 쿼리를 조금 바꿨어, 나는 그것을 고쳐야한다. – Pablo

1
SELECT a.d, a.m, b.strEmpName 
FROM  (
      SELECT strDepartment d, MAX(monSalary) m 
      FROM  (
        SELECT * 
        FROM  tblEmployee e 
        LEFT JOIN tblEmpSalary s ON e.inEmployeeID = s.intEmployeeID 
        ) 
      GROUP BY strDepartment 
     ) a 
LEFT JOIN (
      SELECT * 
      FROM  tblEmployee e 
      LEFT JOIN tblEmpSalary s ON e.inEmployeeID = s.intEmployeeID 
     ) b ON a.d=b.strDepartment AND a.m=b.M 
+0

높이 평가, nawfal :> –

0
SELECT tblEmployee.strEmpName, max_salaries.strDepartment, max_salaries.salary 
FROM (SELECT tblEmployee.strDepartment, MAX(monSalary) 
     FROM tblEmployee INNER JOIN tblEmpSalary 
      ON tblEmployee.intEmployeeID = tblEmpSalary.intEmployeeID 
     GROUP BY tblEmployee.strDepartment) max_salaries 
INNER JOIN tblEmployee ON tblEmployee.strDepartment = max_salaries.strDepartment 
INNER JOIN tblEmpSalary ON tblEmpSalary.monSalary = max_salaries.salary 
      AND tblEmpSalary.intEmployeeID = tblEmployee.intEmployeeID 

-이 지정된 부서 모두를 반환합니다.

3

이 경우 순위 기능을 사용할 수 있습니다 만 맨 위의 급여를 가지고 사람들을 필요로하는 경우

WITH ranked AS (
    SELECT 
    e.*, 
    s.monSalary, 
    rnk = RANK() OVER (PARTITION BY e.strDepartment ORDER BY s.monSalary DESC) 
    FROM tblEmplopyee e 
    INNER JOIN tblEmpSalary s ON e.intEmployeeID = s.intEmployeeID 
) 
SELECT 
    intEmploeeID, 
    strEmpName, 
    strDepartment, 
    monSalary 
FROM ranked 
WHERE rnk = 1 

RANK() 기능을 할 것입니다. RANK()을 사용하면 동일한 급여가 있으면 부서 당 직원 수보다 쿼리가 반환 될 수 있습니다.

또는 동일한 효과, RANK() 대신 DENSE_RANK()를 사용할 수 있지만, DENSE_RANK() 또한 최고 n 급여 직원을 얻을 수있다. 그러나, 당신이 그 (것)이 일치하는 여러가있는 경우에도, 부서 당 정확히 한 직원이 필요

경우 : (

WHERE rnk <= n 

이 같은 WHERE 상태에서 그를 지정 할 수있을 것입니다) 요구 사항은 RANK() 대신 ROW_NUMBER()을 사용하십시오. 하지만 순위 함수의 ORDER BY 절에 다른 기준을 추가해야 할 수 있습니다 (예 : 같은 :

사실
... ORDER BY s.monSalary DESC, e.strEmpName ASC) 

, ROW_NUMBER() 단순히 쿼리 직원이 지향보다는 급여 지향 할 것입니다.

WHERE rnk <= n 

당신은 MSDN에 SQL Server의 기능을 순위에 대한 자세한 내용을보실 수 있습니다 : ROW_NUMBER()으로, 당신은 당신의 쿼리가 DENSE_RANK()와 동일한 조건을 사용, 최고 n 대부분의 지불 직원을 반환 가질 수있을 것입니다 :

+0

+1 순위 기준이나 그룹화에 필드를 더 쉽게 추가 할 수 있으므로이 솔루션을 선호합니다 (이 예에서는 하위 부서가있을 수 있습니다). – JeffO

관련 문제