Exécution de calculs cumulatifs en SQL

Page mise à jour :
Date de création de la page :

résumé

La valeur cumulée du montant en unités année-mois est calculée à l’aide de SQL.

Version de vérification de l’opération

Versions de SQL Server prises en charge

  • 2005
  • 2008
  • 2008 R2

Vérifier la version de SQL Server

  • 2005
  • 2008
  • 2008 R2

Version Windows testée

  • 2008
  • 2008 R2

substance

Normalement, lors de l’utilisation d’une base de données, le montant d’argent est souvent calculé pour l’année et le mois spécifiés, mais il existe également des cas où le montant de ce mois est ajouté en fonction des données du mois précédent telles que le montant et l’inventaire. Vous pouvez calculer des valeurs cumulatives stockées ou par programme, mais pour l’instant, je veux faire le calcul uniquement en SQL.

Il y a un tableau ci-dessous, avec des montants fixés pour chaque année et chaque mois:

Année-Mois Montant Cumulé Année-Unité Montant Cumulé
201004 100 zéro zéro
201005 200 zéro zéro
201006 150 zéro zéro
201007 300 zéro zéro
201008 50 zéro zéro
201009 220 zéro zéro
201010 240 zéro zéro
201011 280 zéro zéro
201012 400 zéro zéro
201101 450 zéro zéro
201102 520 zéro zéro
201103 120 zéro zéro
201104 140 zéro zéro
201105 450 zéro zéro
201106 270 zéro zéro
201107 640 zéro zéro
201108 340 zéro zéro
201109 230 zéro zéro
201110 280 zéro zéro
201111 320 zéro zéro
201112 350 zéro zéro
201201 230 zéro zéro
201202 270 zéro zéro
201203 350 zéro zéro

Pour effectuer une mise à jour par lots en SQL, au lieu d’utiliser « le montant du mois précédent » comme « le montant du mois précédent », vous pouvez calculer la valeur cumulée en attachant la condition que le montant passé soit agrégé à partir de l’année cible et du mois.

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

Lorsque vous exécutez le code SQL ci-dessus, la valeur cumulative est entrée dans « Montant cumulé ».

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

En outre, si vous souhaitez réinitialiser la valeur cumulative chaque année, vous pouvez la calculer en modifiant l’expression conditionnelle.

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

Lorsque vous exécutez le code SQL ci-dessus, la valeur cumulative est entrée dans « Montant annuel cumulé ».

Année-Mois Montant Cumulé Année-Unité Montant Cumulé
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