2012-06-30 38 views
0

我在SQL Server中有一個名爲[Donations]的表格,其中包含由各種人員提供的捐款。查詢獲得每個人的最大捐贈

它的領域是:

FirstName,LastName,FullName,Description --VARCHARs 
DateOrdered, --DATE 
Donation  --MONEY 

我希望返回的所有字段的表,但我只希望每個人的最大的捐獻記錄,不是所有的捐贈。

假設表格中包含8條記錄,John Doe有5條捐贈記錄,Jane Doe有3條。 我希望寫一個查詢,它能給我John的捐款記錄,這是他捐獻的最大捐款和捐款記錄珍妮是她最大的捐款。

如何在SQL中編寫此代碼?

非常感謝您的幫助。

回答

3
select 
    * 
from 
    donations d 
where 
    donation=(select max(donation) from donations where fullname=d.fullname group by fullname) 

這裏假定全名是你在這張桌子上的PK。

+2

這將返回多行,如果該人捐贈的不同日期 –

+0

相同的最高金額是的,我想我需要以更好地PK來這個。這雖然會幫助我。謝謝。 –

1

下面是一個使用排序功能的例子:

DECLARE @Donations TABLE (FirstName VARCHAR(128),LastName VARCHAR(128), 
FullName VARCHAR(256),Description VARCHAR(1024), 
DateOrdered DATETIME, Donation DECIMAL) 
INSERT @Donations VALUES 
('John', 'Doe', 'John Doe', '', '20120605', 125), 
('John', 'Doe', 'John Doe', '', '20120603', 12.34), 
('John', 'Doe', 'John Doe', '', '20120602', 13.59), 
('John', 'Doe', 'John Doe', '', '20120609', 125), 
('John', 'Doe', 'John Doe', '', '20120601', 15), 
('Jane', 'Doe', 'Jane Doe', '', '20120612', 155), 
('Jane', 'Doe', 'Jane Doe', '', '20120613', 152), 
('Jane', 'Doe', 'Jane Doe', '', '20120612', 155) 


-- Return maximum donations including duplicate donations 
-- on different and same dates 
;WITH a AS 
(
    SELECT *, 
      DENSE_RANK() OVER (PARTITION BY FullName 
       ORDER BY Donation DESC) DenseRank 
    FROM @Donations 
) 

SELECT * 
FROM a 
WHERE DenseRank = 1 
ORDER BY Donation DESC, DateOrdered DESC 

-- Return maximum donations including duplicate donations on same dates, 
-- excluding duplicate donations on different dates 
;WITH a AS 
(
    SELECT *, 
      DENSE_RANK() OVER (PARTITION BY FullName 
       ORDER BY Donation DESC, DateOrdered DESC) DenseRank 
    FROM @Donations 
) 

SELECT * 
FROM a 
WHERE DenseRank = 1 
ORDER BY Donation DESC, DateOrdered DESC 

-- Return maximum donations excluding duplicate donations 
-- on same and different dates 
;WITH a AS 
(
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY FullName 
       ORDER BY Donation DESC, DateOrdered DESC) RowNum 
    FROM @Donations 
) 

SELECT * 
FROM a 
WHERE RowNum = 1 
ORDER BY Donation DESC, DateOrdered DESC 
0

試試這個:

select d1.*,(select max(d2.donation) where d2.fullname=d1.fullname group d2.fullname) from donation d1;