PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 18/05/2022 17:40:03

ichelly
Membre

Calcul récursif / boucle

Bonjour ,

J'ai besoin de vos lumières concernant un besoin à implémenter en SQL  sous postgresql)

- En fait il s'agit de migrer un traitement sous excel vers une routine SQL.
- Ma source de données est une table avec 3 colonnes Year , KPI_01 et KPI_02
- Ma cible est d'updater la colonne calculée KPI_03 avec la règle de calcul suivante :
     Pour chaque Year
          Si KPI_01 < 0 alors KPI_02
          Sinon Min(KPI_02 , - Somme(Cumul KPI_03 jusqu'à Year -1)

Ci-dessous le jeux de données avec le résultat attendu.

*******************************************

YEAR    KPI_01    KPI_02    KPI_03
2018    -3545235    0    -3545235
2019    -1797850    471793,95    471793,95
2020    -17955167    -4362475,59    -4362475,59
2021    -106708191    -23963316,48    -23963316,48
2022    -205647157    -26713520,82    -26713520,82
2023    -302080334    -26036957,79    -26036957,79
2024    -363951142    -16705118,16    -16705118,16
2025    -403253712    -10611693,9    -10611693,9
2026    -367437476    9670383,72    9670383,72
2027    -306559897    16436946,33    16436946,33
2028    -244404786    16781879,97    16781879,97
2029    -179627270    17489929,32    17489929,32
2030    -105133635    20113281,45    20113281,45
2031    -24311996    21821842,53    21821842,53
2032    62226500    23365393,92    9152260,47
2033    151072915    23988532,05    0
2034    247467741    26026603,02    0
2035    322009247    20126206,62    0

*******************************************

Merci beaucoup pour votre aide.

Bien Cdt,
Ibrahim

Dernière modification par ichelly (18/05/2022 18:36:37)

Hors ligne

#2 19/05/2022 11:49:17

ichelly
Membre

Re : Calcul récursif / boucle

Hello ,

Finalement , J'ai trouvé la solution : 

CREATE OR REPLACE FUNCTION UPDATE_KPI03() RETURNS BOOLEAN
    LANGUAGE PLPGSQL
AS
$$
DECLARE
    TABLE_RECORD RECORD;
    CALC_BP_YEAR VARCHAR;
    CALC_KPI_03 NUMERIC;
BEGIN
    FOR TABLE_RECORD IN SELECT BP_YEAR ,KPI_02,KPI_03  FROM VALO_IT ORDER BY BP_YEAR 

        LOOP
             SELECT BP_YEAR ,
                          SUM(CASE
                              WHEN KPI_01 IS NULL AND KPI_02 IS NOT NULL THEN KPI_02
                              WHEN KPI_01 < 0 THEN KPI_02
                              ELSE
                                  CASE WHEN KPI_02 < (SELECT -SUM(KPI_03) FROM VALO_IT WHERE BP_YEAR < TABLE_RECORD.BP_YEAR)  THEN KPI_02
                                  ELSE
                                        (SELECT -SUM(KPI_03) FROM VALO_IT WHERE BP_YEAR < TABLE_RECORD.BP_YEAR)
                                  END
                              END ) AS KPI_03
                              
                              INTO CALC_BP_YEAR, CALC_KPI_03
                              
                           FROM VALO_IT
                           WHERE  BP_YEAR = TABLE_RECORD.BP_YEAR
                           GROUP BY BP_YEAR ;

             UPDATE VALO_IT
             SET KPI_03 = CALC_KPI_03
             WHERE BP_YEAR = CALC_BP_YEAR ; 
        END LOOP;

    RETURN TRUE;
END
$$;

SELECT UPDATE_KPI03();

Ibrahim

Hors ligne

Pied de page des forums