Principales respuestas
Cómo hago este UPDATE...???

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