2015-07-22 4 views
3
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 

Balance для счета 3 является Null, он возвращает null, когда дело доходит до вычитания чего-либо от null.

Для примера:

select 5 - NULL 

NULL возвращается.

Вопрос: Теперь, как я могу получить Balance вместо NULL?

ответ

3

Вы можете использовать coalesce:

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

Что разн б/w 'isnull' и' coalesce'? – Shaharyar

+1

@Shaharyar: [здесь хорошая статья] (http://sqlmag.com/t-sql/coalesce-vs-isnull) – potashin

1

попробовать это с использованием ISNULL (значение, 0) будет принимать нулевые значения в 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 
0

Проблема со значениями NULL, SUM агрегатная функция игнорирует NULL. Функция Coalesce заменит ее на 0, если найдены значения NULL.

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 
+0

Я думаю, что нет никакого различия для моего сценария, проверяю ли я 'NULL' перед' SUM' или после 'SUM'. Имеет ли это? – Shaharyar

0

Оба Coalesce() и IsNull() Использование функции для проверки Нулевое значение

IsNull (@ переменная, 0)
Coalesce (@ Variable, 0)

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