2015-03-30 58 views
0

如何顯示產生許多員工獲得的最高收入的記錄。我相信聚合函數'MAX'&'SUM'可能會被應用,但我不能正確的。最終,我不希望顯示「most_revenue」列。涉及2張桌子。如果需要,我很樂意提供更多信息。如何通過集合函數max和sum顯示最大值?

以下是我的嘗試,它的工作原理,但不是根據我的需要:

SELECT TOP (1) pa.personID, pa.nric, SUM(gd.bookingFee) AS most_revenue 
FROM Person_Emp AS pa 
INNER JOIN Geo_Date AS gd 
ON (pa.personID = gd.employeeID) 
GROUP BY pa.personID, pa.nric 
; 

表結構&樣本數據, Geo_Date關係:

dateID | bookingFee | employeeID 
    1   25    16 
    2   10    17 
    3   15    17 
    4   20    17 
    ... 

Person_Emp關係

personID |  NRIC 
16   | 3453535345   
17   | 1231312 
18   | 13413413 
19   | 123434411 
20   | 12312312 

因此,我必須顯示一個' Person Person'誰收入最高,在這種情況下應該是personID'17',與PersonID'16'相比,他的總收入爲45美元。

當然,在確定其他人賺取的最高金額之前,我需要總結每個personID獲得的總收入。非常感謝!

+0

請提供表結構,一些樣本的輸入數據和期望的輸出。 – jpw 2015-03-30 23:04:12

+0

謝謝jpw,我做了編輯。 – 2015-03-31 02:45:23

回答

0

由於您使用的是SQL Server 2012,因此您可以使用像rank()這樣的窗口功能來執行此操作。

select personID 
from (
    select personID, rank() over (order by sum(bookingFee) desc) sales_rank 
    from person_emp pe 
    left join geo_date gd on pe.personID = gd.employeeID 
    group by personID 
) data 
where sales_rank = 1 

如果你有多個總人數相同的人,他們都將獲得1級並被退回。

或者僅使用max()sum()和無窗函數:

select pe.personID 
from person_emp pe 
left join geo_date gd on pe.personID = gd.employeeID 
group by pe.personID 
having sum(bookingfee) = (
    select max(sum_of_bookingfee) 
    from (
     select employeeID, sum(bookingFee) sum_of_bookingfee 
     from geo_date 
     group by employeeID 
    ) data 
)