1

SQL Server 2005 に次のストアド プロシージャがあります。

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)

BondAmount、BondTotal、および BondBalance の dbNull 値を取得しています。Charge 行や BalanceForgiveness 行などがない場合があります。私が得ている問題は、行のデータを含まないテーブルが 1 つある場合、その計算全体が null になることだと思います...どうすればこれを修正できますかテーブルにデータがあるかどうかに関係なく、すべての債券の正確な金額、合計、残高を教えてください。

4

2 に答える 2

5

合計を でラップしますISNULL

ISNULL (SUM(Charge.BondAmount), 0)

合計する要素がないときに合計を0にしたい場合。

于 2012-05-16T20:19:10.400 に答える
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)
于 2012-05-17T14:38:56.500 に答える