#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 онлайн