Buenas estoy de vuelta por acá en esta ocasión quiero compartirles un forma bastante interesante de como programar el acumulado de una columna para una tabla en SQL. Existen varias formas de programar esto, la más común y que pienso a la mayoría de nosotros se nos ocurriría sería crear un cursor el cual vaya recorriendo la columna y acumulado con una variable auxiliar. Algo como esto:
--Declaración de la tabla temp a utilizar para el ejemplo. DECLARE @TABLA AS TABLE ( CODIGO INT NOT NULL IDENTITY(1,1), DATO DECIMAL(10,2), ACUMULADO DECIMAL(10,2) DEFAULT 0 ) --Agregamos algunos datos a la tabla. INSERT INTO @TABLA (DATO) VALUES (5),(10),(8),(9),(15),(20) --Declaración de variables y cursor a utilizar DECLARE @Cod INT,@Dato DECIMAL (10,2),@DatoAcum DECIMAL (10,2)=0 DECLARE C2 CURSOR FOR SELECT CODIGO,DATO FROM @TABLA OPEN C2 FETCH C2 INTO @Cod,@Dato --Ciclo para recorrer el cursor. WHILE @@FETCH_STATUS = 0 BEGIN --Acumulamos el dato. SET @DatoAcum += @Dato --Actualizamos la columna con los datos acumulados hasta el momento UPDATE @TABLA SET ACUMULADO=@DatoAcum WHERE CODIGO=@Cod FETCH C2 INTO @Cod,@Dato END CLOSE C2 --Obtenemos el resultado SELECT * FROM @TABLA
Veamos el resultado del código
Como podemos ver es una implementación valida, resuelve nuestro problema y acumula la columna de manera exitosa, pero a pesar de esto quise buscar otra manera más corta de poder resolver la misma situación y fue donde encontré como hacerlo con únicamente un par de líneas. Para esto utilice una variable del mismo tipo de dato de la columna a acumular, y una sentencia update la cual encierra toda la ciencia del código. Sin más explicación veamos el código que es bastante sencillo.
--Declaración de la tabla temp a utilizar para el ejemplo. DECLARE @TABLA AS TABLE ( CODIGO INT NOT NULL IDENTITY(1,1), DATO DECIMAL(10,2), ACUMULADO DECIMAL(10,2) DEFAULT 0 ) --Agregamos algunos datos a la tabla. INSERT INTO @TABLA (DATO) VALUES (5),(10),(8),(9),(15),(20) --Declaración de variables a utilizar DECLARE @ACUM DECIMAL(10,2)=0 --Sentencia UPDATE la cual utiliza la variable de tal forma que permite calcular el acumulado UPDATE @TABLA SET @ACUM=ACUMULADO=@ACUM+DATO --Obtenemos el resultado SELECT * FROM @TABLA
Veamos el resultado del código
Y listo en solo un par líneas y de una manera mucho más eficiente logramos obtener el mismo resultado que cuando utilizamos el cursor. Espero el código compartido les sea de ayuda y logren ahorrarse algunas líneas de código cuando tengan que resolver algo similar. Gracias por su tiempo!!