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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]和\[2\]提供了关于在SQL查询使用select null的两种思路。在这两个例子,使用了子查询和ifnull函数来处理null值。在第一个例子,通过在外层再套一次select,并使用select null的思路,实现了返回null的效果。而在第二个例子,使用了ifnull函数来判断是否为空,如果为空则返回null。这些方法可以根据具体的需求和数据库系统的支持来选择使用。 引用\[3\]提供了关于null值在MySQL的处理规则。在MySQLnull值表示"没有数据"或"没有值"。在比较运算符和算术运算符作用于null值时,结果恒为null。在除以0的运算,结果也是null。某些函数作用在null值上时,结果也是null,比如concat()函数。在进行distinct、group by和order by操作时,null值被视为相同。在执行order by时,如果是升序排序,null值将放在最前面;如果是降序排序,null值将放在最后面。聚合函数如count()、sum()、min()、max()等,如果作用于可能存在null的列上,会自动忽略null值。 综上所述,使用select null可以在SQL查询返回null值,具体的处理方法可以根据具体的需求和数据库系统的支持来选择。在MySQLnull值有特定的处理规则,需要根据具体情况进行判断和处理。 #### 引用[.reference_title] - *1* *2* [select null](https://blog.csdn.net/Gaojiaotong/article/details/124778955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MySqlnull值及其处理](https://blog.csdn.net/zhang3361999/article/details/104354059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值