Realización de cálculos acumulativos en SQL

Actualización de la página :
Fecha de creación de la página :

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