Краткий ответ, да
Более длинный ответ, вы можете использовать переменную, чтобы подсчитать ее, пока она перебирает строки, то есть
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
гарантирует, что @Balance инициализируется до 0, прежде чем начать. Затем для каждой строки устанавливается значение @Balance @Balance + In - Out
, а затем выводится рассчитанное значение.
Также стоит удостовериться, что ORDER согласован, иначе баланс будет меняться в зависимости от того, в каком порядке возвращаются строки. Если вы хотите затем упорядочить его, например, обратно, вы можете использовать его как подзапрос, так как тогда внешний запрос обрабатывает вычисленные значения, таким образом гарантируя, что Баланс остается правильным, т.е.
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