[Code] Cómo calcular un total acumulado Rápido SIN Cursores

Una de las cosas que nos lleva a usar cursores es el cálculo de totales acumulados, así que usando una de las caraterísticas no muy documentadas de SQL podemos realizar éste trabajo con poco esfuerzo y de una manera rápida y efectiva

 

–DBCC DROPCLEANBUFFERS — Limpia caché de datos SOLO SE UTILIZA PARA COMPARAR CON OTRAS IMPLEMENTACIONES ELIMNAR EN AMBIENTE DE PRODUCCIÓN

–DBCC FREEPROCCACHE — Limipia el caché de procedimientos SOLO SE UTILIZA PARA COMPARAR CON OTRAS IMPLEMENTACIONES ELIMNAR EN AMBIENTE DE PRODUCCIÓN

GO

declare @runningtotal decimal(17,2)

set @runningtotal = 0

update TablaValores

set @runningtotal = ValorAcumulado = @runningtotal + ValorFila

 

Espero sea de ayuda

 

FREDDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

 

5 comentarios en “[Code] Cómo calcular un total acumulado Rápido SIN Cursores”

  1. Freddy, ten cuidado con ese código que estas recomendado!!

    Esta claro que sustituir un cursor por un update para hacer un total acumulado es un muy buen tip destinado a programadores novatos en SQL Server, pero precisamente porque tu target son programadores principiantes sin mucho conocimiento de la plataforma, es más que posible que muchos de ellos no entiendan lo que hace el DBCC DROPCLEANBUFFERS y el DBCC FREEPROCCACHE y lo suelten sin mas en su entorno de producción, lo que no creo que haga falta que te diga que es MUY pernicioso para el rendimiento y estabilidad del sistema.

    De hecho, yo tampoco entiendo para que haces esas dos llamadas: me da la impresión que forman parte de un script mas completo que hace una evaluación de rendimiento, ¿me equivoco? Te recomendaría encarecidamente que editaras el post y eliminaras las llamadas a DBCC DROPCLEANBUFFERS y DBCC FREEPROCCACHE que nada tiene que ver con la sustitución del cursor, y así evitamos que la gente que quiera hacer solo un copy y paste la lie parda en sus servidores ¿te parece?

    un abrazo!

  2. Hola, muy buenas.

    También valdría o me equivoco:

    declare @runningtotal decimal(17,2)

    @runningtotal = (select Sum(ValorFila)
    from TablaValores)

    Y creo que es más simple, ya lo que no sé cual es más eficiente, pero sería cuestión de probar la ejecución de los dos.

  3. Saludos, gracias por el comentario, revisando la info que enviaste, observo primero que hay un error de sintaxis, supongo que propones:

    declare @runningtotal decimal(17,2)
    (select @runningtotal = Sum(ValorFila)
    from TablaValores)

    Si se deja de esa manera calcula sólo el valor de la suma total de todos los elementos de la tabla, el script de cálculo de acumulados calcula el total que va corriendo, fila a fila, por ejemplo:

    Valor | Acumulado
    1 | 1
    3 | 4
    4 | 8

    Si lo estoy en lo correcto?, cuentanos para ver como podemos mejorarlo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *