используя mysql, рассчитайте баланс с точки зрения трасс

#php #mysql

Вопрос:

MySQL Я хочу выполнить запрос, с помощью которого я могу определить общее количество с помощью формулы:

Всего Открыто = Последняя Запись(Всего Открыто) Всего Нет — Всего В

 DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(transaction_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,client_id INT NOT NULL
,action_type VARCHAR(12) NOT NULL
,action_amount INT NOT NULL
);

INSERT INTO my_table(client_id,action_type,action_amount) VALUES
(1            ,'credit',         1000),
(1            ,'debit',          100),
(1            ,'credit',         500),
(1            ,'debit',          300),
(2            ,'debit',          1000),
(2            ,'credit',         1200),
(3            ,'debit',          1000),
(3            ,'credit',         1000),
(4            ,'debit',          1000);
 

Я хочу Результата

 Transaction_id | Client Id | Credit | Debit | Balance
       1       |    1      |  1000  |    0  | 1000 
       2       |    1      |     0  |  100  |  900 
       3       |    1      |   500  |    0  | 1400 
       4       |    1      |     0  |  300  | 1100
 

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

1. Пожалуйста, расскажите, что вы пробовали до сих пор и где вы застряли!

Ответ №1:

Начиная с MySQL 8.0 вы можете использовать функцию окна в качестве решения:

 select 
    transaction_id,
    client_id,
    if(action_type='credit', action_amount, 0) credit,
    if(action_type='debit', action_amount, 0) debit,
    sum(if(action_type='credit', action_amount, -action_amount)) over(partition by client_id order by transaction_id) balance
from transactions;
 

Запустите MySQL онлайн

Ответ №2:

Это на самом деле не ответ на ваш вопрос, но я думаю, что вы ищете запрос, подобный следующему:

 SELECT DISTINCT
    t1.client_id,
    t2.action_amount credit,
    t3.action_amount debit
FROM
    my_table t1
LEFT JOIN my_table t2
  ON ( t1.client_id = t2.client_id AND t2.action_type = 'credit' )
LEFT JOIN my_table t3
  ON ( t1.client_id = t3.client_id AND t3.action_type = 'debit' );
 

Вы можете увидеть результат этого запроса по этой ссылке : http://sqlfiddle.com/#!9/9929da/11

Ответ №3:

 SET @csum =0; 
select *
FROM(
SELECT
transaction_id,
client_id ,
IF(action_type="credit",action_amount, 0) as CrAmt,
IF(action_type<>"credit",action_amount, 0) as DrAmt,
(@csum := @csum   IF(action_type="credit", action_amount, (action_amount*-1)))as balance
FROM `my_table` 
WHERE client_id = '1'  
ORDER BY `my_table`.`transaction_id`) as cTbl
order by transaction_id DESC
 

Запустите MySQL онлайн