Vykonávanie kumulatívnych výpočtov v SQL
súhrn
Kumulatívna hodnota sumy v jednotkách ročného mesiaca sa vypočíta pomocou SQL.
Verzia kontroly operácie
Podporované verzie SQL Servera
- 2005
- 2008
- 2008 R2
Kontrola verzie SQL Servera
- 2005
- 2008
- 2008 R2
Testovaná verzia systému Windows
- 2008
- 2008 R2
látka
Za normálnych okolností sa pri použití databázy suma peňazí často vypočíta za určený rok a mesiac, ale existujú aj prípady, keď sa suma tohto mesiaca pripočíta na základe údajov predchádzajúceho mesiaca, ako je suma a inventár. Kumulatívne hodnoty môžete vypočítať uložené alebo programovo, ale zatiaľ chcem výpočet vykonať iba v SQL.
Nižšie je uvedená tabuľka so sumami stanovenými pre každý rok a mesiac:
| Kumulatívna suma kumulatívnej | ročnej jednotkovej sumy | ||
|---|---|---|---|
| 201004 | 100 | nula | nula | 
| 201005 | 200 | nula | nula | 
| 201006 | 150 | nula | nula | 
| 201007 | 300 | nula | nula | 
| 201008 | 50 | nula | nula | 
| 201009 | 220 | nula | nula | 
| 201010 | 240 | nula | nula | 
| 201011 | 280 | nula | nula | 
| 201012 | 400 | nula | nula | 
| 201101 | 450 | nula | nula | 
| 201102 | 520 | nula | nula | 
| 201103 | 120 | nula | nula | 
| 201104 | 140 | nula | nula | 
| 201105 | 450 | nula | nula | 
| 201106 | 270 | nula | nula | 
| 201107 | 640 | nula | nula | 
| 201108 | 340 | nula | nula | 
| 201109 | 230 | nula | nula | 
| 201110 | 280 | nula | nula | 
| 201111 | 320 | nula | nula | 
| 201112 | 350 | nula | nula | 
| 201201 | 230 | nula | nula | 
| 201202 | 270 | nula | nula | 
| 201203 | 350 | nula | nula | 
Ak chcete aktualizovať v dávke v SQL, namiesto použitia "sumy predchádzajúceho mesiaca" ako "sumy predchádzajúceho mesiaca" môžete vypočítať kumulatívnu hodnotu priložením podmienky, že minulá suma je agregovaná z cieľového roka a mesiaca.
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.年月
Keď vykonáte vyššie uvedené SQL, kumulatívna hodnota sa zadá do položky "Suma kumulatívna".
| Kumulatívna suma kumulatívnej | ročnej jednotkovej sumy | ||
|---|---|---|---|
| 201004 | 100 | 100 | nula | 
| 201005 | 200 | 300 | nula | 
| 201006 | 150 | 450 | nula | 
| 201007 | 300 | 750 | nula | 
| 201008 | 50 | 800 | nula | 
| 201009 | 220 | 1020 | nula | 
| 201010 | 240 | 1260 | nula | 
| 201011 | 280 | 1540 | nula | 
| 201012 | 400 | 1940 | nula | 
| 201101 | 450 | 2390 | nula | 
| 201102 | 520 | 2910 | nula | 
| 201103 | 120 | 3030 | nula | 
| 201104 | 140 | 3170 | nula | 
| 201105 | 450 | 3620 | nula | 
| 201106 | 270 | 3890 | nula | 
| 201107 | 640 | 4530 | nula | 
| 201108 | 340 | 4870 | nula | 
| 201109 | 230 | 5100 | nula | 
| 201110 | 280 | 5380 | nula | 
| 201111 | 320 | 5700 | nula | 
| 201112 | 350 | 6050 | nula | 
| 201201 | 230 | 6280 | nula | 
| 201202 | 270 | 6550 | nula | 
| 201203 | 350 | 6900 | nula | 
Okrem toho, ak chcete kumulatívnu hodnotu každý rok resetovať, môžete ju vypočítať zmenou podmieneného výrazu.
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.年月
Keď vykonáte vyššie uvedené SQL, kumulatívna hodnota sa zadá do "Kumulatívna ročná suma".
| Kumulatívna suma kumulatívnej | ročnej jednotkovej sumy | ||
|---|---|---|---|
| 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 |