Обратное значение NULL в SQL - PullRequest
0 голосов
/ 09 января 2019

Если в таблице вывода нет данных [Account No: 100.200.330.444], а в таблице депозита нет данных [Account No: 100.200.330.444], то отображается только NULL. Но я хочу показать 0.

Я создаю виртуальную таблицу и сделать main balance [Account No: 100.200.330.444]
Мой код как deposit_amount - withdraw_amount = Result
Когда выводится таблица пустая, то отзыв null
Я хочу показать main_balance = 0

CREATE VIEW xyz as select account_no as account_no,
 CASE  
  when sum(deposit_amount)=null then 0
  when sum(deposit_amount)=0 then 0
ELSE sum(deposit_amount)
END
-
 (select  
  CASE  
   when sum(withdraw_amount)=null then 0
   when sum(withdraw_amount)=0 then 0
  ELSE sum(withdraw_amount)
 END
 from withdraws
  )as balance from deposits group by account_no 

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Я думаю, что вы должны написать этот запрос как JOIN вместо:

SELECT d.account_no, COALESCE(d.deposits, 0) - COALESCE(w.withdrawals, 0) AS balance
FROM (SELECT account_no, SUM(deposit_amount) AS deposits
      FROM deposits
      GROUP BY account_no) d
LEFT JOIN (SELECT account_no, SUM(withdraw_amount) AS withdrawals
           FROM withdraws
           GROUP BY account_no) w ON w.account_no = d.account_no

Обратите внимание, что я предполагаю, что на каждом счете есть хотя бы один депозит (для открытия счета). Если нет, то вместо этого вам нужно будет эмулировать FULL JOIN (см. в этом вопросе , чтобы узнать, как это сделать).

0 голосов
/ 09 января 2019

Это почти невозможно точно выразить в представлении MySQL из-за ограничений, которые MySQL накладывает на представления. Если вам нужны все учетные записи, начните с таблицы учетных записей и используйте коррелированные подзапросы в select:

select a.account_no,
       ((select coalesce(sum(d.deposit_amount), 0)
         from deposits d
         where d.account_no = a.account_no
        ) -
        (select coalesce(sum(d.withdraw_amount), 0)
         from withdraws w
         where w.account_no = a.account_no
        )
       ) as balance
from accounts a;

MySQL не разрешает подзапросы в предложении FROM, что делает другие формулировки гораздо более сложными.

0 голосов
/ 09 января 2019

Нельзя использовать арифметические операторы в пустом поле. Нуль равен Unknown, поэтому x = unknown всегда неизвестен.

если вы хотите проверить нули, вы можете использовать

  1. IsNull: i.e. IsNull(Field)
  2. is null: i.e. Where Field is null;
  3. coalesce: i.e. coalesce(Field, valueIfNull)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...