Mysql выбирает сумму из двух таблиц с помощью join

#mysql #sql

#mysql #sql

Вопрос:

Я хочу получить значение баланса из двух таблиц политики и платежи. Приведенный ниже код MySQL:

 SELECT Sum(policy.premium)                                                   AS 
       `total` 
       , 
       (SELECT Sum(payments.amount) 
        FROM   payments 
        WHERE  ( payments.date_paid BETWEEN '2019-03-01' AND '2019-03-31' )) AS 
       `paid` 
FROM   `policy` 
       LEFT JOIN payments 
              ON policy.code = payments.code 
WHERE  ( policy.st BETWEEN '2019-03-01' AND '2019-03-31' ) 
       AND policy.trn_type = 0 
  

оплаченный столбец возвращает значение null, и как я могу получить разницу между total и paid.

Ответ №1:

Вы можете вычислить 2 значения следующим образом:

 select t.total, coalesce(t.paid, 0) paid, (t.total - coalesce(t.paid, 0)) diff from (
  select 
    (select sum(premium) from policy where st between '2019-03-01' and '2019-03-31' and policy.trn_type=0) total,
    (select sum(amount) from payments where date_paid between '2019-03-01' and '2019-03-31') paid
) t
  

Комментарии:

1. (выберите sum (premium) из политики, где st между ‘2019-03-01’ и ‘2019-03-31’ и policy.trn_type=0) и выберите sum (сумма) из payments, где работает date_paid между ‘2019-03-01’ и ‘2019-03-31’, но выберите t.total, т.е.оплаченный, (т.е.total — т.оплаченный) diff из (выберите (выберите sum (premium) из политики, где st между ‘2019-03-01’ и ‘ 2019-03-31’ и policy.trn_type=0) итого (выберите sum (сумма) из платежей, где date_paid между ‘2019-03-01’ и ‘2019-03-31’) оплачено ) t выдает ошибку, близкую к (выберите sum (сумма) из платежей, где date_paid между ‘2019-03-01’ и ‘2019-03-31’) pa

2. я получаю синтаксическую ошибку рядом (выберите сумму из payments, где date_paid между ‘2019-03-01’ и ‘2019-03-31’) pa

3. если оплачено, то значение null diff также возвращает значение null, даже если есть общее, например, total = 1500 оплачено = null diff = null, как мне это исправить? bal также должен быть 1500

Ответ №2:

Оплаченный столбец — это только эта часть:

 SELECT SUM(payments.amount) 
FROM payments 
WHERE payments.date_paid BETWEEN '2019-03-01' AND '2019-03-31'
  

Если он возвращает null, сначала проверьте, что у вас есть в ваших данных

Комментарии:

1. Спасибо за ваше предложение, оно вернуло значение null, потому что оно вышло за пределы диапазона дат, я изменил даты, и это сработало, однако как мне получить разницу между total и paid?