La risposta di ypercube è piuttosto spettacolare (non avevo mai visto una creazione di variabili all'interno di una singola query tramite una selezione fittizia del genere), quindi ecco l'istruzione CREATE TABLE per comodità.
Per immagini di dati tabulari in Google Ricerca immagini, puoi utilizzare https://convertio.co/ocr/ o https://ocr.space/ per convertirlo in un documento di testo. Quindi, se l'OCR non ha rilevato correttamente le colonne e disponi di un Mac, utilizza TextWrangler con il tasto opzione premuto per eseguire una selezione rettangolare e spostare le colonne. La combinazione di editor SQL come Sequel Pro , TextWrangler e un foglio di calcolo come Google Docs rende estremamente efficiente la gestione di dati tabulari separati da tabulazioni.
Se potessi inserire tutto questo in un commento, lo farei, quindi per favore non votare questa risposta.
-- DROP TABLE statements;
CREATE TABLE IF NOT EXISTS statements (
id integer NOT NULL AUTO_INCREMENT,
stmnt_date date,
debit integer not null default 0,
credit integer not null default 0,
PRIMARY KEY (id)
);
INSERT INTO statements
(stmnt_date , debit, credit) VALUES
('2014-06-17', 20000, 0 ),
('2014-08-14', 0 , 3000 ),
('2014-07-16', 0 , 3000 ),
('2015-02-01', 3000 , 0 ),
('2014-05-15', 3000 , 0 );
-- this is slightly modified from ypercube's (@b := 0 vs @b := 0.0)
SELECT
s.stmnt_date, s.debit, s.credit,
@b := @b + s.debit - s.credit AS balance
FROM
(SELECT @b := 0) AS dummy
CROSS JOIN
statements AS s
ORDER BY
stmnt_date ASC;
/* result
+------------+-------+--------+---------+
| stmnt_date | debit | credit | balance |
+------------+-------+--------+---------+
| 2014-05-15 | 3000 | 0 | 3000 |
| 2014-06-17 | 20000 | 0 | 23000 |
| 2014-07-16 | 0 | 3000 | 20000 |
| 2014-08-14 | 0 | 3000 | 17000 |
| 2015-02-01 | 3000 | 0 | 20000 |
+------------+-------+--------+---------+
5 rows in set (0.00 sec)
*/