0

表1

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

表 2

  DeptID  DeptNam
  1       IT                           
  2       Finance                
  3       Marketing 

表 3

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

質問 : 各部門で最も給与が高い人を見つけてください

返す行: CustomerID DeptName Salary

質問 : 各部門で最も給与が高い人を見つけてください

返す行: CustomerID DeptName Salary

このための SQL クエリの書き方を教えてくれる人はいますか?

4

4 に答える 4

1

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

部門ごとの最大給与が重複している場合、このクエリは部門ごとに複数の結果を返すことを考慮する必要があります。

于 2012-07-27T20:53:40.270 に答える
0

CTEwithROW_NUMBER関数を使用した SQL-Server 2005 以降の場合:

各部門で最も給与が高い人を見つける

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

これがsql-fiddleです:http://sqlfiddle.com/#!3/41ff1/2/0


給与が同じ場合に複数の顧客を返したい場合は、@Lamak が提案したRANK代わりに使用します。ROW_NUMBER

違いは次のとおりです

于 2012-07-27T21:00:32.723 に答える
0

これを試して:

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 
于 2012-07-28T06:23:06.503 に答える
0
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
于 2012-07-27T22:43:21.667 に答える