Risposta breve, sì
Risposta più lunga, puoi usare una variabile per calcolarla mentre scorre lungo le righe, ad es.
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
Il , (SELECT @Balance := 0) AS variableInit
assicura che @Balance sia inizializzato su 0 prima di iniziare. Per ogni riga, quindi, imposta @Balance come @Balance + In - Out
, quindi restituisce il valore calcolato.
Inoltre, vale la pena accertarsi che l'ORDINE sia coerente, altrimenti il saldo varierà a seconda dell'ordine in cui vengono restituite le righe. Se si desidera quindi riordinarlo in primo piano, ad esempio, è possibile utilizzarlo come sottoquery poiché la query esterna si occupa dei valori calcolati garantendo così che il saldo rimanga corretto, ad esempio
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