Esecuzione di calcoli cumulativi in SQL

Pagina aggiornata :
Data di creazione della pagina :

sommario

Il valore cumulativo dell'importo in unità anno-mese viene calcolato utilizzando SQL.

Versione di controllo del funzionamento

Versioni di SQL Server supportate

  • 2005
  • 2008
  • 2008 R2 ·

Controllare la versione di SQL Server

  • 2005
  • 2008
  • 2008 R2 ·

Versione di Windows testata

  • 2008
  • 2008 R2 ·

sostanza

Normalmente, quando si utilizza un database, la quantità di denaro viene spesso calcolata per l'anno e il mese specificati, ma ci sono anche casi in cui l'importo di questo mese viene aggiunto in base ai dati del mese precedente come l'importo e l'inventario. È possibile calcolare i valori cumulativi memorizzati o a livello di codice, ma per ora voglio fare il calcolo solo in SQL.

C'è una tabella qui sotto, con gli importi fissati per ogni anno e mese:

Importo anno-mese Importo cumulativo anno-unità Importo cumulativo
201004 100 nullo nullo
201005 200 nullo nullo
201006 150 nullo nullo
201007 300 nullo nullo
201008 50 nullo nullo
201009 220 nullo nullo
201010 240 nullo nullo
201011 280 nullo nullo
201012 400 nullo nullo
201101 450 nullo nullo
201102 520 nullo nullo
201103 120 nullo nullo
201104 140 nullo nullo
201105 450 nullo nullo
201106 270 nullo nullo
201107 640 nullo nullo
201108 340 nullo nullo
201109 230 nullo nullo
201110 280 nullo nullo
201111 320 nullo nullo
201112 350 nullo nullo
201201 230 nullo nullo
201202 270 nullo nullo
201203 350 nullo nullo

Per eseguire l'aggiornamento in un batch in SQL, invece di utilizzare "l'importo del mese precedente" come "l'importo del mese precedente", è possibile calcolare il valore cumulativo allegando la condizione che l'importo passato sia aggregato dall'anno e dal mese di destinazione.

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.年月

Quando si esegue l'SQL precedente, il valore cumulativo viene immesso in "Importo cumulativo".

Importo anno-mese Importo cumulativo anno-unità Importo cumulativo
201004 100 100 nullo
201005 200 300 nullo
201006 150 450 nullo
201007 300 750 nullo
201008 50 800 nullo
201009 220 1020 nullo
201010 240 1260 nullo
201011 280 1540 nullo
201012 400 1940 nullo
201101 450 2390 nullo
201102 520 2910 nullo
201103 120 3030 nullo
201104 140 3170 nullo
201105 450 3620 nullo
201106 270 3890 nullo
201107 640 4530 nullo
201108 340 4870 nullo
201109 230 5100 nullo
201110 280 5380 nullo
201111 320 5700 nullo
201112 350 6050 nullo
201201 230 6280 nullo
201202 270 6550 nullo
201203 350 6900 nullo

Inoltre, se si desidera reimpostare il valore cumulativo ogni anno, è possibile calcolarlo modificando l'espressione condizionale.

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.年月

Quando si esegue l'SQL precedente, il valore cumulativo viene immesso in "Importo annuale cumulativo".

Importo anno-mese Importo cumulativo anno-unità Importo cumulativo
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