Exécution de calculs cumulatifs en SQL
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 |