2012-05-16 3 views
1

Я имею следующую хранимую процедуру в SQL Server 2005:процедура SQL Server возвращения DBNull вместо суммы

ALTER PROCEDURE dbo.GetBondAmounts 
    (
    @Username varchar(20) 
    ) 
AS 
    SELECT Bond.ID BondID, Powers.BondAmount + Charges.BondAmount BondAmount, 
    BondFee.Amount + Powers.BondPremium + Charges.BondPremium + Forfeiture.CostOfApprehension + Forfeiture.AmountPaid BondTotal, 
    BondFee.Amount + Powers.BondPremium + Charges.BondPremium + Forfeiture.CostOfApprehension + Forfeiture.AmountPaid 
    - BalanceForgiveness.Amount - Payment.Amount 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) BondAmount, 
     SUM(Charge.BondPremium) BondPremium 
     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) BondAmount, SUM(BondPremium) BondPremium 
     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) 

Я получаю значение DBNull для BondAmount, BondTotal и BondBalance. Иногда не будет строк Charge или нет строк BalanceForgiveness и т. Д. Я думаю, что проблема, которую я получаю, состоит в том, что когда есть одна таблица, которая не содержит данных для строки, весь этот расчет становится нулевым ... как я могу это исправить дайте мне правильную сумму, сумму и баланс для каждой облигации, независимо от того, сколько таблиц имеет данные или нет.

ответ

0

@Albin: Благодарим вас за помощь в привлечении меня к этому решению. Обертка SUM в ISNULL на самом деле ничего не сделала, но когда я сделал следующее, это сработало. Спасибо, что помогли мне добраться до решения.

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) 
4

Оберните свои суммы в ISNULL.

ISNULL (SUM(Charge.BondAmount), 0) 

Если вы хотите, чтобы сумма была равна 0, когда нет никаких сумм.

+0

Я проверил несколько раз после этого, и обертывание ISNULL вокруг сумм все же оставило меня с теми же результатами. – Grungondola

Смежные вопросы