Вставка данных баланса в таблицу реляционной базы данных - PullRequest
0 голосов
/ 08 мая 2020

Я использую реляционную базу данных (MySQL). В этой базе данных у меня есть таблица с именем customer_transaction. В этой таблице у меня есть 4 столбца: id, customer_id, type, amount

|id|customer_id |type     |amount|
|--|------------|---------|------|
|1 |44          |Credit   |50    |
|2 |44          |Credit   |20    |
|3 |44          |Debit    |30    |

Я хочу ввести столбец баланса (текущий баланс) в этой таблице, как показано ниже.

|id|customer_id |type     |amount|balance|
|--|------------|---------|------|-------|
|1 |44          |Credit   |50    |50     |
|2 |44          |Credit   |20    |70     |
|3 |44          |Debit    |30    |40     |

два возможных подхода:

  1. когда строка вставлена ​​в таблицу, MySQL автоматически (процедура или что-то еще) вычисляет баланс и вставляет в поле баланса.

  2. Или вычисление баланса на уровне приложения и вставка в БД.

Итак, я хочу знать, какой подход лучше и Замечательно, если кто-нибудь может предложить мне любой пример подхода номер 1 . Но это еще одна проблема, если я хочу удалить строку, то как повторно синхронизировать c все данные для балансировки?

1 Ответ

0 голосов
/ 08 мая 2020

Один подход, который должен работать с любой версией MySQL:

SELECT
    id,
    customer_id,
    type,
    amount,
    (SELECT SUM(CASE WHEN type = 'Credit' THEN amount ELSE -1.0* amount END)
     FROM yourTable t2
     WHERE t2.customer_id = t1.customer_id AND t2.id <= t1.id) AS balance
FROM yourTable t1
ORDER BY
    customer_id,
    id;

screen capture from demo link below

Демо

На MySQL 8+ мы можем воспользоваться функциями analyti c, чтобы избежать написания длинных коррелированных подзапросов:

SELECT
    id,
    customer_id,
    type,
    amount,
    SUM(CASE WHEN type = 'Credit' THEN amount ELSE -1.0* amount END) OVER
        (PARTITION BY customer_id ORDER BY id) AS balance
FROM yourTable t1
ORDER BY
    customer_id,
    id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...