2009-04-16 3 views
2

Проблема: мне нужно найти все активные [GiftPledges], у которых последние три [GiftDetails] имеют нулевую сумму.Проблема TOP N с предложением GROUP BY

SELECT gp.PledgeId FROM GiftPledge gp 
     INNER JOIN GiftDetail gd ON gp.PledgeId = gd.PledgeId 
     WHERE gp.PledgeStatus = 'A' 
     GROUP BY PledgeId 
     HAVING COUNT(PledgeId) >= 3 

Теперь у меня есть все мои [GiftPledges], у которых есть как минимум три [GiftDetails].

SELECT TOP 3 gdi.Amt FROM GiftDetail gdi 
     INNER JOIN GiftHeader ghi ON gdi.GiftRef = ghi.GiftRef 
     WHERE gdi.PledgeId = gp.PledgeId 
     ORDER BY ghi.GDate DESC 

Это дает мне три последних [GiftDetails], связанных с данным [GiftPledge]. Проблема в том, что я не знаю, как суммировать второй запрос и быть частью предложения WHERE в первом запросе.

Я нашел this article о «Top п в группе», и что кажется как направление мне нужно быть во главе, но я не уверен, что я на правильном пути.

Любая помощь, разъяснения или предложения были бы весьма полезными.

ответ

2
SELECT gp.PledgeId FROM GiftPledge gp 
     INNER JOIN GiftDetail gd ON gp.PledgeId = gd.PledgeId 
     WHERE gp.PledgeStatus = 'A' 
     GROUP BY PledgeId 
     HAVING COUNT(PledgeId) >= 3 
AND 
GP.PledgeID in (
SELECT PledgeID From 
(
SELECT TOP 3 gp.PledgeID, gdi.Amt FROM GiftDetail gdi 
     INNER JOIN GiftHeader ghi ON gdi.GiftRef = ghi.GiftRef 
     WHERE gdi.PledgeId = gp.PledgeId 
     ORDER BY ghi.GDate DESC 
) x_amt 
Group By PledgeID 
Having SUM(AMT)) x_sum = 0 

что-то вроде этого в любом случае.