La respuesta de ypercube es bastante espectacular (nunca había visto una creación variable dentro de una sola consulta a través de una selección ficticia como esa), así que aquí está la declaración CREATE TABLE para su conveniencia.
Para imágenes de datos tabulares en Google Image Search, puede usar https://convertio.co/ocr/ o https://ocr.space/ para convertirlo en un documento de texto. Luego, si el OCR no detectó columnas correctamente, y tiene una Mac, use TextWrangler con la tecla de opción presionada para realizar una selección rectangular y mover las columnas. La combinación del editor SQL como Sequel Pro , TextWrangler y una hoja de cálculo como Google Docs hace que el manejo de datos tabulares separados por tabulaciones sea extremadamente eficiente.
Si pudiera poner todo esto en un comentario, lo haría, así que por favor no vote esta respuesta.
-- 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)
*/