none
Sumar o restar en una columna en base al valor de otra y haciendo corte por ID RRS feed

  • Pregunta

  • Qué tal amigos!

    Definitivamente cuando doy vueltas en círculo con el mismo asunto es momento de recurrir con los expertos.

    Les cuento:

    Tengo una tabla llamada Registros con esta estructura:


    Lo que requiero hacer es agregar a la derecha una nueva columna donde se vaya calculando un saldo (Ya sea sumar o restar) en base al valor que tiene cada registro en la columna Concepto; algo como esto:


    Como pueden observar necesito que el cálculo se comience a hacer a partir del importe del primer registro de cada ID, es decir como si fuera haciendo un corte y en base a los registros posteriores se vaya haciendo el cálculo. Por ejemplo para cuando el concepto es 1 debe sumar y para 2 y 3 debe restar.

    Comencé intentando apoyarme de un case comenzando con el concepto 1 pero no obtuve muy buenos resultados:

    SELECT fecha,ID SUM(CASE concepto WHEN '1' THEN importe  - 1 ELSE importe END) AS Saldo
    FROM Registros
    GROUP BY ID ORDER BY Fecha;

    Alguna sugerencia de lo que me pueda servir? Se los agradecería muchísimo!

    Saludos!

    viernes, 19 de enero de 2018 23:33

Respuestas

  • Es muy simple si sumarizas los valores (+/-) sobre el conjunto particionado y ordenado, por ejemplo:

    SELECT
        id, concepto, fecha, importe, 
        SUM(importe * IIF(concepto = 1, 1, -1))  
    	   OVER(PARTITION BY id ORDER BY fecha ROWS UNBOUNDED PRECEDING) AS saldo
    FROM Registros
    ORDER BY id, fecha;
    GO


    viernes, 19 de enero de 2018 23:55
  • Creo que en 2008 R2 iif no es aceptado y tu query quedaría como 
    SELECT
        id, concepto, fecha, importe, 
        SUM(importe * case when concepto = 1 then 1 else  -1 end)  
    	   OVER(PARTITION BY id ORDER BY fecha ROWS UNBOUNDED PRECEDING) AS saldo
    FROM Registros
    ORDER BY id, fecha;
    GO


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 23 de enero de 2018 7:38
    Moderador

Todas las respuestas