두 테이블 tblEmployee
및 tblEmpSalary
이 있다고 가정합니다. 모든 직원의 이름, 급여, 각 부서에서 가장 높은 급여를받는 사람의 목록을 얻으려면 SQL 문을 작성해야합니다.두 테이블의 특정 열 선택
샘플 테이블 데이터가 여기에 있습니다 :
두 테이블 tblEmployee
및 tblEmpSalary
이 있다고 가정합니다. 모든 직원의 이름, 급여, 각 부서에서 가장 높은 급여를받는 사람의 목록을 얻으려면 SQL 문을 작성해야합니다.두 테이블의 특정 열 선택
샘플 테이블 데이터가 여기에 있습니다 :
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)
면책 조항 : 잘못 몇 가지 작은 세부 사항을 가질 수 있도록 나는 지금이 쿼리를 테스트 할 수 없습니다. 동일한 최대 급여와 두 개 이상의 직원의 경우
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
높이 평가, nawfal :> –
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
-이 지정된 부서 모두를 반환합니다.
이 경우 순위 기능을 사용할 수 있습니다 만 맨 위의 급여를 가지고 사람들을 필요로하는 경우
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
대부분의 지불 직원을 반환 가질 수있을 것입니다 :
+1 순위 기준이나 그룹화에 필드를 더 쉽게 추가 할 수 있으므로이 솔루션을 선호합니다 (이 예에서는 하위 부서가있을 수 있습니다). – JeffO
안녕하세요 @ 파블로 좋은 소리지만 'varchar 값'C++ - '을 데이터 유형 int'로 변환 할 때 오류가 발생했습니다. 부서 ID가 없으며 부서명 만 있습니다. – yeasir007
@ yeasir007 그래, 내가 쿼리를 조금 바꿨어, 나는 그것을 고쳐야한다. – Pablo