none
Cómo hago este UPDATE...??? RRS feed

  • Pregunta

  • Hola a Todos:

    Es la misma tabla.

    Necesito actualizar el campo "acumulado" con la suma del campo valor.

    Como puedo hacer eso sin usar cursores...???

    Muchas Gracias.

    Atte.

    PEV


    pev


    • Editado pev lunes, 1 de marzo de 2021 23:22
    lunes, 1 de marzo de 2021 23:21

Respuestas

  • Hola, aqui un idea

    CREATE TABLE #TABLA
    (
    FECHA DATETIME,
    VALOR INT,
    ACUMULADO INT
    )
    
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201201',3,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201202',4,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201203',2,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201204',5,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201205',1,0)
    ;
    WITH CTE AS(
    SELECT TOP(100) T1.FECHA,
    T1.VALOR,
    SUM(T2.VALOR) AS ACUMULADO
    FROM #TABLA T1
    INNER JOIN #TABLA T2 ON T1.FECHA >=T2.FECHA
    GROUP BY T1.FECHA,
    T1.VALOR ORDER BY T1.FECHA
    ) 
    
    UPDATE T
    SET
    T.ACUMULADO=CTE.ACUMULADO
    FROM #TABLA T
    INNER JOIN CTE ON T.FECHA=CTE.FECHA
    
    SELECT * FROM #TABLA
    
    DROP TABLE #TABLA



    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 martes, 2 de marzo de 2021 0:12
    • Marcado como respuesta pev martes, 2 de marzo de 2021 16:42
    martes, 2 de marzo de 2021 0:11
  • Hola pev:

    Con el escenario

    Create table valores (Fecha date, valor int, acumulado int)
    go
    insert into valores (Fecha, valor, acumulado)
    values
    ('20201201',3,0),
    ('20201202',4,0),
    ('20201203',2,0),
    ('20201204',5,0),
    ('20201205',1,0);

    Si tú SQL Server es mayor o igual a 2012 (Select @@version), puedes utilizar las funciones de ventana.

    With cte as (
    	Select * , SUM(valor) over(order by (fecha)) as ValorAcum
    	from valores 
    	)
    Update valores set acumulado = cte.valorAcum
    	from valores inner join cte on 
    			valores.Fecha = cte.Fecha 
    		and valores.valor= cte.valor;

    Solo tienes que utilizar la función de agrupación sum para la columna en cuestión y añadir el over con una cláusula order by que la misma espera.

    A la salida de la tabla de expresión común, realizas la update. 

    Select valores.fecha
    	 , valores.valor
    	 , valores.acumulado
    	   From dbo.valores;

    Over

    https://docs.microsoft.com/es-es/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-ver15

    Tablas de expresión común

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    • Marcado como respuesta pev martes, 2 de marzo de 2021 16:42
    martes, 2 de marzo de 2021 4:52

Todas las respuestas

  • Hola, aqui un idea

    CREATE TABLE #TABLA
    (
    FECHA DATETIME,
    VALOR INT,
    ACUMULADO INT
    )
    
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201201',3,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201202',4,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201203',2,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201204',5,0)
    INSERT INTO #TABLA(FECHA,VALOR,ACUMULADO)VALUES('20201205',1,0)
    ;
    WITH CTE AS(
    SELECT TOP(100) T1.FECHA,
    T1.VALOR,
    SUM(T2.VALOR) AS ACUMULADO
    FROM #TABLA T1
    INNER JOIN #TABLA T2 ON T1.FECHA >=T2.FECHA
    GROUP BY T1.FECHA,
    T1.VALOR ORDER BY T1.FECHA
    ) 
    
    UPDATE T
    SET
    T.ACUMULADO=CTE.ACUMULADO
    FROM #TABLA T
    INNER JOIN CTE ON T.FECHA=CTE.FECHA
    
    SELECT * FROM #TABLA
    
    DROP TABLE #TABLA



    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú


    • Editado Augusto1982 martes, 2 de marzo de 2021 0:12
    • Marcado como respuesta pev martes, 2 de marzo de 2021 16:42
    martes, 2 de marzo de 2021 0:11
  • Hola pev:

    Con el escenario

    Create table valores (Fecha date, valor int, acumulado int)
    go
    insert into valores (Fecha, valor, acumulado)
    values
    ('20201201',3,0),
    ('20201202',4,0),
    ('20201203',2,0),
    ('20201204',5,0),
    ('20201205',1,0);

    Si tú SQL Server es mayor o igual a 2012 (Select @@version), puedes utilizar las funciones de ventana.

    With cte as (
    	Select * , SUM(valor) over(order by (fecha)) as ValorAcum
    	from valores 
    	)
    Update valores set acumulado = cte.valorAcum
    	from valores inner join cte on 
    			valores.Fecha = cte.Fecha 
    		and valores.valor= cte.valor;

    Solo tienes que utilizar la función de agrupación sum para la columna en cuestión y añadir el over con una cláusula order by que la misma espera.

    A la salida de la tabla de expresión común, realizas la update. 

    Select valores.fecha
    	 , valores.valor
    	 , valores.acumulado
    	   From dbo.valores;

    Over

    https://docs.microsoft.com/es-es/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-ver15

    Tablas de expresión común

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    • Marcado como respuesta pev martes, 2 de marzo de 2021 16:42
    martes, 2 de marzo de 2021 4:52
  • Muchas gracias a ambos. Funcionó…

    pev

    martes, 2 de marzo de 2021 16:41