TOP N проблема с предложением GROUP BY

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

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 в первом запросе.

Я нашел эту статью о "Лучших n в группе" и похоже, что мне нужно двигаться в этом направлении, но я не уверен, что на правильном пути.

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


person drovani    schedule 16.04.2009    source источник


Ответы (1)


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

что-то в этом роде.

person Jeremy    schedule 16.04.2009