domingo, 22 de febrero de 2015

Programar columna acumulada SQL en dos líneas

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!!