2012-07-19 62 views
1

好吧,所以我知道這是一個很大的過程,但我的問題很簡單。我試圖從此獲得債券的單個實例,但是由於我是管理員,因此它會將系統中與該代理機構相關的用戶數量提供給每個實例。這發生在OR EXISTS語句的底部。我只需要幫助,找出如何將結果限制爲每個債券1,同時仍然獲得所需數量的正確結果,這就是爲什麼個別聯結聲明是必需的。使這個函數返回截然不同的結果

ALTER PROCEDURE dbo.GetBondAmounts 
    (
    @Username varchar(20) 
    ) 
AS 
    SELECT Bond.ID BondID, (ISNULL(Powers.Amount,0) + ISNULL(Charges.Amount,0)) BondAmount, 
    (ISNULL(BondFee.Amount,0) + ISNULL(Powers.Premium,0) + ISNULL(Charges.Premium,0) 
    + ISNULL(Forfeiture.CostOfApprehension,0) + ISNULL(Forfeiture.AmountPaid,0) + Bond.StateTax) BondTotal, 
    (ISNULL(BondFee.Amount,0) + ISNULL(Powers.Premium,0) + ISNULL(Charges.Premium,0) 
    + ISNULL(Forfeiture.CostOfApprehension,0) + ISNULL(Forfeiture.AmountPaid,0) + Bond.StateTax 
    - ISNULL(BalanceForgiveness.Amount,0) - ISNULL(Payment.Amount,0)) BondBalance 
    FROM Bond 
    LEFT OUTER JOIN UserAgency ON Bond.Agency = UserAgency.Agency 
    LEFT OUTER JOIN 
    (
     SELECT BondID, SUM(AmountForgiven) Amount 
     FROM BalanceForgiveness 
     GROUP BY BondID 
    ) AS BalanceForgiveness ON Bond.ID = BalanceForgiveness.BondID 
    LEFT OUTER JOIN 
    (
     SELECT Bond, SUM(Amount) Amount 
     FROM BondFee 
     GROUP BY Bond 
    ) AS BondFee ON Bond.ID = BondFee.Bond 
    LEFT OUTER JOIN 
    (
     SELECT Powers.Bond, SUM(Charge.BondAmount) Amount, 
     ISNULL(SUM(Charge.BondPremium), 0) Premium 
     FROM Powers INNER JOIN Charge ON Powers.Surety = Charge.PowerSurety 
     AND Powers.PowerPrefix = Charge.PowerPrefix AND Powers.PowerNumber = Charge.PowerNumber 
     GROUP BY Bond 
    ) AS Powers ON Bond.ID = Powers.Bond 
    LEFT OUTER JOIN 
    (
     SELECT BondID, SUM(BondAmount) Amount, SUM(BondPremium) Premium 
     FROM ChargeWithoutPower 
     GROUP BY BondID 
    ) AS Charges ON Bond.ID = Charges.BondID 
    LEFT OUTER JOIN 
    (
     SELECT Bond, SUM(CostOfApprehension) CostOfApprehension, SUM(AmountPaid) AmountPaid 
     FROM Forfeiture 
     GROUP BY Bond 
    ) AS Forfeiture ON Bond.ID = Forfeiture.Bond 
    LEFT OUTER JOIN 
    (
     SELECT Bond, SUM(Amount) Amount 
     FROM Payment 
     GROUP BY Bond 
    ) AS Payment ON Bond.ID = Payment.Bond 
    WHERE UserAgency.Username = @Username 
    OR EXISTS (SELECT * FROM Users WHERE Username = @Username AND Admin = 1) 
+0

我認爲你正在努力尋找其中'UserAgency.UserName'等於'@ Username'或記錄,如果失敗,查找記錄其中'UserAgency.Username'等於來自'用戶'表的一些用戶匹配'@用戶名'和'Admin =',對吧?用戶表和UserAgency.Username之間的連接是什麼? – 2012-07-19 18:22:33

回答

1

好的,所以我找到了我自己的答案,我的問題。我只需要使UserAgency與其他連接相同。下面是它的外觀:

LEFT OUTER JOIN 
(
    SELECT Agency, Username FROM UserAgency 
    WHERE Username = @Username 
) AS UserAgency ON Bond.Agency = UserAgency.Agency