Сумма, вычитание и объединение нескольких столбцов таблицы MySQL - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть четыре таблицы MySQL client, transaction, other_loan и payment.Я хочу получить sum из load_amount и additional из таблицы transaction + sum из amount из other_loan и subtract в sum из payment_amount в таблице payment.Как мне этого добиться?

Результат, который я хочу:

>  ID | Name     |  Amount
>  1  | Robin    | 8718  
>  2  | Reynaldo | 21
>  3  | Leomar   | 0

Мои таблицы: транзакция

>  tid | id| date       | load_amount | additional
>  1   | 1 | 2018-12-01 |    90       | 0  
>  2   | 1 | 2018-12-07 |    90       | 0
>  3   | 2 | 2018-12-08 |    49       | 2

таблица: other_loan

> oid | id| amount   |  date
> 1   | 1 | 7928     | 2018-12-10
> 2   | 1 | 750      | 2018-12-10

таблица: оплата

> pid |id | payment_amount  | date
> 1   | 1 |      50         | 2015-12-10
> 2   | 1 |      90         | 2015-12-10
> 3   | 2 |      30         | 2015-12-10

таблица: клиент

> id | Name       |  
> 1  | Robin      | 
> 2  | Cinderella |
> 3  | Leomar     | 

1 Ответ

0 голосов
/ 11 декабря 2018

Поскольку у вас есть несколько транзакций, других сумм займов и платежей на одного клиента, вы не можете сделать прямые JOIN таблиц друг с другом, так как это приведет к репликации строк, что приведет к неправильным значениям.Вместо этого мы SUM все значения в каждой таблице на клиентской основе до , делая JOIN.Кроме того, поскольку некоторые клиенты не имеют записей в каждой таблице, вы должны использовать LEFT JOIN s и COALESCE в результатах, чтобы из-за пустых строк суммы SUM не стали NULL.Этот запрос должен дать вам нужные результаты:

SELECT c.id, c.name,
       COALESCE(t.transactions, 0) + COALESCE(o.amounts, 0) - COALESCE(p.payments, 0) AS amount
FROM client c
LEFT JOIN (SELECT id, SUM(load_amount) + SUM(additional) AS transactions
           FROM transaction
           GROUP BY id) t on t.id = c.id
LEFT JOIN (SELECT id, SUM(amount) AS amounts
           FROM other_loan
           GROUP BY id) o ON o.id = c.id
LEFT JOIN (SELECT id, SUM(payment_amount) AS payments
           FROM payment
           GROUP BY id) p ON p.id = c.id
GROUP BY c.id

Вывод (для ваших примеров данных):

id  name        amount
1   Robin       8718
2   Cinderella  21
3   Leomar      0

Демонстрация по SQLFiddle

...