SQL中SELECT中列SUM运算后为null

列上做运算时,SUM后的数值一旦为null,那么相加后的值就是null,导致运算后错误,
此时就需要ISNULL函数(MySQL是IFNULL)
对比:

只用SUM函数:
SUM(a)=1.5,
SUM(b)=null,
SUM(a)+SUM(b) = null 

用函数ISNULL函数后:
ISNULL(SUM(a), 0) = 1.5
ISNULL(SUM(b), 0) = 0
ISNULL(SUM(a), 0) + ISNULL(SUM(b), 0) = 1.5

以下是我自己的SQL案例


SELECT IC.CustNo,
       IC.AccountStatus,
       IC.CustomerName,
       SD.ItemName,
       tb0.CountCard                                                                  CountCard,
       SUM(IARMB.Balance)                                                             AccountBalance,
       SUM(tb0.ReserveFund)                                                           ReserveFund,
       SUM(tb0.Balance)                                                               CardBalance,
       ISNULL(SUM(tb1.sumMoney), 0) + ISNULL(SUM(tb1.sumRefundProfit), 0)             RfuStore,
       ISNULL(SUM(tb2.sumRevokeMoney), 0) + ISNULL(SUM(tb2.sumRevokeRefundProfit), 0) RfuStoreRevoke,
       SUM(tb3.sumRefundMoney)                                                        SumRefundMoney,
       ISNULL(SUM(tb5.sumMoney), 0) + ISNULL(SUM(tb5.sumRefundProfit), 0)             PaymentOfArrears,
       ISNULL(SUM(tb5.sumMoney), 0) + ISNULL(SUM(tb5.sumRefundProfit), 0) +
       ISNULL(SUM(tb1.sumMoney), 0) + ISNULL(SUM(tb1.sumRefundProfit), 0) +
       ISNULL(SUM(tb2.sumRevokeMoney), 0) + ISNULL(SUM(tb2.sumRevokeRefundProfit), 0) RealStoreMoney,
       SUM(tb4.sumQty)                                                                SumQty,
       SUM(tb4.sumActualMoney)                                                        SumActualMoney
FROM IC_Cust IC
         LEFT JOIN IC_AccountRFUMoneyBal IARMB ON IC.CustNo = IARMB.CustNo
         LEFT JOIN SysDic SD ON SD.ItemType = 6 AND SD.ItemId = IC.AccountStatus
         LEFT JOIN (SELECT COUNT(1) CountCard, IUC.CustNo, SUM(IUCB.ReserveFund) ReserveFund, SUM(IUCB.Balance) Balance
                    FROM IC_UserCard IUC
                             LEFT JOIN IC_UserCardBal IUCB ON IUCB.CardNo = IUC.CardNo
                    WHERE 1 = 1
                      AND IUC.CardStatus IN (2, 4)
                    GROUP BY IUC.CustNo) tb0 ON tb0.CustNo = IC.CustNo
         LEFT JOIN (SELECT IC.CustNo, SUM(IARMSD.Money) sumMoney, SUM(IARMSD.RefundProfit) sumRefundProfit
                    FROM IC_Cust IC
                             LEFT JOIN IC_AccountRFUMoneyStoreDtl IARMSD
                                       ON IC.CustNo = IARMSD.CustNo AND IARMSD.OptType = 17
                    WHERE 1 = 1
                      AND IARMSD.OptTime BETWEEN '2023-01-01 00:00:00' and '2023-03-31 23:59:59'
                    GROUP BY IC.CustNo) tb1 ON tb1.CustNo = IC.CustNo
         LEFT JOIN (SELECT IC.CustNo,
                           SUM(IARMSD2.Money)        sumRevokeMoney,
                           SUM(IARMSD2.RefundProfit) sumRevokeRefundProfit
                    FROM IC_Cust IC
                             LEFT JOIN IC_AccountRFUMoneyStoreDtl IARMSD2
                                       ON IC.CustNo = IARMSD2.CustNo AND IARMSD2.OptType = 18
                    WHERE 1 = 1
                      AND IARMSD2.OptTime BETWEEN '2023-01-01 00:00:00' and '2023-03-31 23:59:59'
                    GROUP BY IC.CustNo) tb2 ON tb2.CustNo = IC.CustNo
         LEFT JOIN (SELECT IC.CustNo, SUM(IARMSD3.Money) sumRefundMoney
                    FROM IC_Cust IC
                             LEFT JOIN IC_AccountRFUMoneyStoreDtl IARMSD3
                                       ON IC.CustNo = IARMSD3.CustNo AND IARMSD3.OptType = 21
                    WHERE 1 = 1
                      AND IARMSD3.OptTime BETWEEN '2023-01-01 00:00:00' and '2023-03-31 23:59:59'
                    GROUP BY IC.CustNo) tb3 ON tb3.CustNo = IC.CustNo
         LEFT JOIN (SELECT IC.CustNo, SUM(IARMSD.Money) sumMoney, SUM(IARMSD.RefundProfit) sumRefundProfit
                    FROM IC_Cust IC
                             LEFT JOIN IC_AccountRFUMoneyStoreDtl IARMSD
                                       ON IC.CustNo = IARMSD.CustNo AND IARMSD.OptType = 20
                    WHERE 1 = 1
                      AND IARMSD.OptTime BETWEEN '2023-01-01 00:00:00' and '2023-03-31 23:59:59'
                    GROUP BY IC.CustNo) tb5 ON tb5.CustNo = IC.CustNo

         LEFT JOIN (SELECT IC.CustNo, SUM(TOT.Qty) sumQty, SUM(TOT.ActualMoney) sumActualMoney
                    FROM IC_Cust IC
                             LEFT JOIN T_OilTrade TOT ON TOT.CustNo = IC.CustNo
                    WHERE 1 = 1
                      AND TOT.PayTime BETWEEN '2023-01-01 00:00:00' and '2023-03-31 23:59:59'
                    GROUP BY IC.CustNo) tb4 ON tb4.CustNo = IC.CustNo
WHERE 1 = 1
--   AND IC.CustNo = '000152940580'
GROUP BY IC.CustNo, IARMB.Balance, IC.AccountStatus, IC.CustomerName,
         SD.ItemName, tb0.CountCard

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值