Realización de cálculos acumulativos en SQL
resumen
El valor acumulado de la cantidad en unidades año-mes se calcula utilizando SQL.
Versión de comprobación de funcionamiento
Versiones de SQL Server compatibles
- 2005
- 2008
- R2 2008
Comprobar la versión de SQL Server
- 2005
- 2008
- R2 2008
Versión probada de Windows
- 2008
- R2 2008
sustancia
Normalmente, cuando se utiliza una base de datos, la cantidad de dinero a menudo se calcula para el año y el mes especificados, pero también hay casos en los que la cantidad de este mes se agrega en función de los datos del mes anterior, como la cantidad y el inventario. Puede calcular los valores acumulativos almacenados o mediante programación, pero por ahora quiero hacer el cálculo solo en SQL.
Hay una tabla a continuación, con montos establecidos para cada año y mes:
Monto anual-mes | Acumulado | monto anual-unitario acumulado | |
---|---|---|---|
201004 | 100 | nulo | nulo |
201005 | 200 | nulo | nulo |
201006 | 150 | nulo | nulo |
201007 | 300 | nulo | nulo |
201008 | 50 | nulo | nulo |
201009 | 220 | nulo | nulo |
201010 | 240 | nulo | nulo |
201011 | 280 | nulo | nulo |
201012 | 400 | nulo | nulo |
201101 | 450 | nulo | nulo |
201102 | 520 | nulo | nulo |
201103 | 120 | nulo | nulo |
201104 | 140 | nulo | nulo |
201105 | 450 | nulo | nulo |
201106 | 270 | nulo | nulo |
201107 | 640 | nulo | nulo |
201108 | 340 | nulo | nulo |
201109 | 230 | nulo | nulo |
201110 | 280 | nulo | nulo |
201111 | 320 | nulo | nulo |
201112 | 350 | nulo | nulo |
201201 | 230 | nulo | nulo |
201202 | 270 | nulo | nulo |
201203 | 350 | nulo | nulo |
Para actualizar en un lote en SQL, en lugar de usar "el monto del mes anterior" como "el monto del mes anterior", puede calcular el valor acumulativo adjuntando la condición de que el monto anterior se agregue del año objetivo y el mes.
update 金額集計Test
set 金額累計 = 累計
from
(
select
A.年月,
sum(B.金額) as 累計
from 金額集計Test A
left outer join 金額集計Test B
on B.年月 <= A.年月
group by A.年月
) as C
where 金額集計Test.年月 = C.年月
Cuando se ejecuta el SQL anterior, el valor acumulativo se introduce en "Cantidad acumulada".
Monto anual-mes | Acumulado | monto anual-unitario acumulado | |
---|---|---|---|
201004 | 100 | 100 | nulo |
201005 | 200 | 300 | nulo |
201006 | 150 | 450 | nulo |
201007 | 300 | 750 | nulo |
201008 | 50 | 800 | nulo |
201009 | 220 | 1020 | nulo |
201010 | 240 | 1260 | nulo |
201011 | 280 | 1540 | nulo |
201012 | 400 | 1940 | nulo |
201101 | 450 | 2390 | nulo |
201102 | 520 | 2910 | nulo |
201103 | 120 | 3030 | nulo |
201104 | 140 | 3170 | nulo |
201105 | 450 | 3620 | nulo |
201106 | 270 | 3890 | nulo |
201107 | 640 | 4530 | nulo |
201108 | 340 | 4870 | nulo |
201109 | 230 | 5100 | nulo |
201110 | 280 | 5380 | nulo |
201111 | 320 | 5700 | nulo |
201112 | 350 | 6050 | nulo |
201201 | 230 | 6280 | nulo |
201202 | 270 | 6550 | nulo |
201203 | 350 | 6900 | nulo |
Además, si desea restablecer el valor acumulativo cada año, puede calcularlo cambiando la expresión condicional.
update 金額集計Test
set 年度単位金額累計 = 累計
from
(
select
A.年月,
sum(B.金額) as 累計
from 金額集計Test A
left outer join 金額集計Test B
on B.年月 <= A.年月
and B.年月 >= case
when cast(right(A.年月, 2) as int) >= 4 then left(A.年月, 4) + N'04'
else cast(cast(left(A.年月, 4) as int) - 1 as nvarchar(4)) + N'04'
end
group by A.年月
) as C
where 金額集計Test.年月 = C.年月
Cuando se ejecuta el SQL anterior, el valor acumulado se introduce en "Cantidad anual acumulativa".
Monto anual-mes | Acumulado | monto anual-unitario acumulado | |
---|---|---|---|
201004 | 100 | 100 | 100 |
201005 | 200 | 300 | 300 |
201006 | 150 | 450 | 450 |
201007 | 300 | 750 | 750 |
201008 | 50 | 800 | 800 |
201009 | 220 | 1020 | 1020 |
201010 | 240 | 1260 | 1260 |
201011 | 280 | 1540 | 1540 |
201012 | 400 | 1940 | 1940 |
201101 | 450 | 2390 | 2390 |
201102 | 520 | 2910 | 2910 |
201103 | 120 | 3030 | 3030 |
201104 | 140 | 3170 | 140 |
201105 | 450 | 3620 | 590 |
201106 | 270 | 3890 | 860 |
201107 | 640 | 4530 | 1500 |
201108 | 340 | 4870 | 1840 |
201109 | 230 | 5100 | 2070 |
201110 | 280 | 5380 | 2350 |
201111 | 320 | 5700 | 2670 |
201112 | 350 | 6050 | 3020 |
201201 | 230 | 6280 | 3250 |
201202 | 270 | 6550 | 3520 |
201203 | 350 | 6900 | 3870 |