【问题标题】:Arithmetic operation on null对 null 的算术运算
【发布时间】:2015-10-11 20:21:38
【问题描述】:
LedgerId    AccountId   EntryType   Debit       Credit      
2               2           D       50000.00    NULL        
3               2           D       10000.00    NULL        
4               2           C       NULL        25000.00    
6               2           C       NULL        10000.00    
7               2           D       89000.00    NULL        
8               2           D       89000.00    NULL        
10              3           D       715871.00   NULL        

以下查询计算Balance

Select Accounts.ID [AccountID],Name,AccountType [AccountType], SUM(Debit) - SUM(Credit) [Balance] FROM Accounts 
    join Dealers on Accounts.DealerId = Dealers.ID 
    join Ledger on Accounts.ID = Ledger.AccountId
    GROUP BY Accounts.ID, Name, AccountType

然后它返回:

AccountID   Name    AccountType     Balance
2           Mateen  P               203000.00
3           Shery   P               NULL

预期输出:

AccountID   Name    AccountType     Balance
2           Mateen  P               203000.00
3           Shery   P               715871.00

帐户 3 的 Balance 为 Null,当从 null 中减去任何内容时,它返回 null

例如:

select 5 - NULL

返回NULL

问题:现在,我怎样才能得到Balance 而不是NULL

【问题讨论】:

    标签: sql sql-server conditional-statements


    【解决方案1】:

    你可以使用coalesce:

    coalesce(sum(Debit), 0) - coalesce(sum(Credit), 0)
    

    【讨论】:

    • isnullcoalesce 有什么区别?
    【解决方案2】:

    尝试使用 isnull(value,0) 将 null 值作为 0

    Select Accounts.ID [AccountID],Name,AccountType [AccountType], 
     SUM(isnull( Debit,0)) - SUM(isnull(Credit,0)) isnull([Balance],0) as 
       Balance FROM Accounts 
         join Dealers on Accounts.DealerId = Dealers.ID 
         join Ledger on Accounts.ID = Ledger.AccountId
    GROUP BY Accounts.ID, Name, AccountType
    

    【讨论】:

      【解决方案3】:

      NULL 值的问题,SUM 聚合函数忽略 NULL 值。 如果发现 NULL 值,Coalesce 函数会将其替换为 0。

          Select Accounts.ID [AccountID],
                 Name,
                 AccountType [AccountType], 
                 SUM(coalesce(Debit,0)) - SUM(coalesce(Credit,0)) [Balance] 
      FROM       Accounts 
                 join Dealers on Accounts.DealerId = Dealers.ID 
                 join Ledger on Accounts.ID = Ledger.AccountId
                 GROUP BY Accounts.ID, Name, AccountType 
      

      【讨论】:

      • 我认为无论是在SUM 之前还是SUM 之后检查NULL,我的方案都没有区别。是吗?
      【解决方案4】:

      Coalesce() 和 IsNULL() 函数都用于检查 Null 值

      IsNULL(@variable,0)
      合并(@Variable,0)

      【讨论】:

        猜你喜欢
        • 2016-06-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 2011-10-22
        • 2012-12-16
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多