Krótka odpowiedź, tak
Dłuższa odpowiedź, możesz użyć zmiennej, aby ją zsumować podczas iteracji w dół wierszy, tj.
SELECT
`table`.`ID`,
`table`.`In`,
`table`.`Out`,
@Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC
, (SELECT @Balance := 0) AS variableInit
zapewnia, że @Balance jest inicjowane na 0 przed rozpoczęciem. Dla każdego wiersza ustawia następnie @Balance na @Balance + In - Out
, a następnie wyświetla obliczoną wartość.
Warto również upewnić się, że ZAMÓWIENIE jest spójne, ponieważ w przeciwnym razie Saldo będzie się różnić w zależności od kolejności zwracania wierszy. Jeśli chcesz, na przykład, uporządkować je z powrotem do przodu, możesz użyć tego jako podzapytania, ponieważ wtedy zewnętrzne zapytanie zajmuje się obliczonymi wartościami, zapewniając w ten sposób poprawność salda, tj.
SELECT
`balanceCalculation`.`ID`,
`balanceCalculation`.`In`,
`balanceCalculation`.`Out`,
`balanceCalculation`.`Balance`
FROM (
SELECT
`table`.`ID`,
`table`.`In`,
`table`.`Out`,
@Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC
) AS `balanceCalculation`
ORDER BY `balanceCalculation`.`ID` DESC