2012-02-22 17 views
5

tengo una tabla que contiene los siguientes datos:Calcular equilibrio con MySQL

ID  In  Out 
1  100.00 0.00 
2  10.00 0.00 
3  0.00 70.00  
4  5.00 0.00  
5  0.00 60.00 
6  20.00 0.00  

Ahora necesito una consulta que me da el siguiente resultado:

ID  In  Out Balance 
1  100.00 0.00 100.00 
2  10.00 0.00 110.00 
3  0.00 70.00 40.00 
4  5.00 0.00 45.00 
5  0.00 60.00 -15.00 
6  20.00 0.00  5.00 

¿Es posible hacer esto con una consulta, sin usar un disparador o procedimientos almacenados?

Respuesta

14

Respuesta corta, sí la respuesta

más largas, puede utilizar una variable para anotar que como itera por las filas, es decir

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 

El , (SELECT @Balance := 0) AS variableInit asegura que @Balance se inicializa a 0 antes tu comienzas Para cada fila, establece @Balance como @Balance + In - Out, y luego emite el valor calculado.

También vale la pena asegurarse de que la ORDEN sea coherente, de lo contrario el Saldo variará según el orden en que se devuelvan las filas. Si quería entonces pedirlo de nuevo a frente, por ejemplo, podría utilizar esto como una subconsulta como entonces las ofertas de consulta externa con los valores calculados garantizando así el equilibrio que queda es decir correcta

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 
+0

cómo con paginación, creo que esta consulta no funciona bien, el equilibrio no va bien –

+0

@PutraLZendrato Me temo que no entiendo la pregunta –

+1

Hola Simon, quiero decir, cómo si los datos la fila es grande. Ejemplo, tenemos 100 datos, pero no cargaremos en una página. Entonces, nos separamos en 2 páginas (trabajo de paginación). Creo que el equilibrio no funcionará. –

3

La respuesta más simple sería BE:

SELECT `ID`, 
     `In`, 
     `Out`, 
     @running_bal := @running_bal + (`In` - `Out`) as `Balance` 
FROM tableName, (SELECT @running_bal := 0) tempName 
0

será suficiente Un simple LEFT JOIN:

SELECT t.ID, t.In, t.Out, (SUM(t2.In) - SUM(t2.Out)) Balance 
FROM mytable t 
    LEFT JOIN mytable t2 ON b2.ID <= b.ID 
GROUP BY b.ID 

O subconsulta (que resulta que es el doble de rápido)

SELECT t.ID, t.In, t.Out, 
    (SELECT SUM(t2.In) - SUM(t2.Out) FROM mytable t2 WHERE t2.ID <= t.ID) Balance 
FROM mytable t;