Рассчитать остатки в таблице транзакций, где пользователи отправляют деньги друг другу - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть таблица транзакций, настроенная так:

-- Transactions table
+----+---------+-------+------------------+--------+-----------+
| id | from_id | to_id | transaction_type | amount | card_type |
+----+---------+-------+------------------+--------+-----------+
| 1  | 1       | 1     | deposit          | 90     | debit     |
| 2  | 1       | 2     | transfer         | -60    | debit     |
| 3  | 2       | 2     | deposit          | 10     | debit     |
| 4  | 2       | 2     | deposit          | 20     | credit    |
+----+---------+-------+------------------+--------+-----------+

Если я внесу депозит, он должен показать положительное значение, чтобы показать, что деньги были добавлены на мой счет, но если я делаю перевод, он должен использовать отрицательный баланс, чтобы показать, что деньги были удалены с моего счета. Проблема в том, что я не могу придумать вопрос, который добавил бы деньги на счет пользователя 2 после передачи пользователя 1, чтобы получить такое представление (в зависимости от типа карты):

-- Debit Balance Table
+---------+---------+
| user_id | balance |
+---------+---------+
| 1       | 30      |
| 2       | 70      |
+---------+---------+

-- Credit Balance Table
+---------+---------+
| user_id | balance |
+---------+---------+
| 1       | 0       |
| 2       | 20      |
+---------+---------+

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

1 Ответ

0 голосов
/ 08 ноября 2018

Для debit вы можете просто выполнить условное агрегирование:

SELECT 
  all_users.user_id, 
  SUM (CASE 
         WHEN t.transaction_type = 'deposit' AND all_users.user_id = t.from_id
           THEN ABS(t.amount) 
         WHEN t.transaction_type = 'transfer' AND all_users.user_id = t.from_id
           THEN -ABS(t.amount)
         WHEN t.transaction_type = 'transfer' AND all_users.user_id = t.to_id
           THEN ABS(t.amount)
         ELSE 0
       END
      ) AS balance 
FROM transactions AS t 
JOIN (
      SELECT from_id AS user_id FROM transactions 
      UNION 
      SELECT to_id FROM transactions
     ) AS all_users 
  ON t.from_id = all_users.user_id OR 
     t.to_id = all_users.user_id 
WHERE t.card_type = 'debit' 
GROUP BY all_users.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...