SQL-Abfrage, um das Ergebnis zu erhalten

Tabelle 1

CutomerID Salary 1 2000 2 3000 3 4000 4 6000 5 5220 

Tabelle 2

  DeptID DeptNam 1 IT 2 Finance 3 Marketing 

Tisch 3

  CustomerID DeptID 1 1 2 1 3 2 4 3 5 3 

Frage: Finde die Leute mit dem höchsten Gehalt in jeder Abteilung

CustomerID DeptName Salary : CustomerID DeptName Salary

Frage: Finde die Leute mit dem höchsten Gehalt in jeder Abteilung

CustomerID DeptName Salary : CustomerID DeptName Salary

Kann mir jemand helfen, wie man die SQL-Abfrage dafür schreibt?

Für SQL server 2005+:

 ;WITH CTE AS ( SELECT T1.*, T3.DeptID, RANK() OVER(PARTITION BY T3.DeptID ORDER BY T1.Salary DESC) RN FROM Table1 AS T1 INNER JOIN Table3 AS T3 ON T1.CustomerId = T3.CustomerId ) SELECT A.CustomerId, B.DeptName, A.Salary FROM CTE A INNER JOIN Table2 B ON A.DeptID = B.DeptID WHERE RN = 1 

Sie sollten berücksichtigen, dass, wenn das maximale Gehalt pro Abteilung dupliziert wird, dann diese Abfrage mehr als ein Ergebnis pro Abteilung zurückgibt.

Von SQL-server 2005 und darüber hinaus mit einem CTE mit ROW_NUMBER function:

Finde die Leute mit dem höchsten Gehalt in jeder Abteilung

 WITH CTE AS ( SELECT t1.CustomerID ,t2.DeptName, t1.Salary , SalaryRank = ROW_NUMBER()OVER(PARTITION BY t2.DeptID ORDER BY t1.Salary DESC) FROM Table1 t1 INNER JOIN Table3 t3 ON t1.CustomerID=t3.CustomerID INNER JOIN Table2 t2 ON t3.DeptID=t2.DeptID ) SELECT CustomerID, DeptName, Salary FROM CTE WHERE SalaryRank = 1 

Hier ist die sql-fiddle : http://sqlfiddle.com/#!3/41ff1/2/0


Wenn Sie mehrere Kunden zurückgeben möchten, wenn sie das gleiche Gehalt haben, verwenden Sie RANK anstelle von ROW_NUMBER wie @Lamak vorgeschlagen hat.

Hier sind die Unterschiede: http://mangalpardeshi.blogspot.de/2008/10/differenz-between-rownumber-rank-and.html

 SELECT a.customerid, c.deptnam, a.salary FROM table1 a JOIN table3 b ON a.customerid = b.customerid JOIN table2 c ON b.deptid = c.deptid JOIN ( SELECT aa.deptid, MAX(bb.salary) AS maxsalary FROM table3 aa JOIN table1 bb ON aa.customerid = bb.customerid GROUP BY aa.deptid ) d ON a.salary = d.maxsalary AND c.deptid = d.deptid 

Versuche dies:

 CREATE TABLE cust(CutomerID int,Salary float) INSERT INTO cust VALUES(1,2000),(2,3000),(3,4000),(4,6000),(5,5220) CREATE TABLE dept(DeptID int,DeptNam varchar(10)) INSERT INTO dept VALUES(1,'IT'),(2,'Finance'),(3,'Marketing') CREATE TABLE custDept(CustomerID int,DeptID int) INSERT INTO custDept VALUES(1,1),(2,1),(3,2),(4,3),(5,3) select a.CutomerID,a.DeptNam,b.sal from (select c.CutomerID ,d.DeptID,c.Salary,d.DeptNam from cust c inner join custDept cd on c.CutomerID = cd.CustomerID inner join dept d on cd.DeptID =d.DeptID) a inner join (select d.DeptID ,MAX(c.Salary) as sal from cust c inner join custDept cd on c.CutomerID = cd.CustomerID inner join dept d on cd.DeptID =d.DeptID group by d.DeptID) b on a.DeptID = b.DeptID and a.Salary = b.sal