IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Problème réinitialisation de cumul


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut Problème réinitialisation de cumul
    Bonjour,

    Je vous explique mon problème: je dois créer une vue avec un champ date et un autre champ qui sera un champ cumulé. Si cette valeur cumulée dépasse 6000000 pendant 7 jours alors il faut que je la réinitialise à 6000000 sur le 8e jour. De plus, si elle est > 0 pendant 30 jours alors elle revient à 0 sur le 31e. J'ai essayé en utilisant les fonctions analytiques mais là je sèche. Auriez vous une idée?

    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Pour ce type de problème, fournir un jeu d'essai plus résultat attendu serait une bonne chose : nous comprendrons mieux votre besoin, et vous aurez certainement un réponse plus rapidement.
    N'hésitez pas aussi à poster la/les requêtes que vous avez tentées.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il faut surtout bien définir l'ancrage de votre date de début de cumul, car si vous regardez à un jour J, il se peut que le cumul des 7 derniers jours dépasse 6000000, mais qu'à J+1 ce ne soit pas le cas.

    De surcroît, quel est votre SGBD ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Bonjour,

    Ma base de données est sous ORACLE 10. En fait le jeu de données est assez simple, une année qui démarre le 01/04 et se termine le 31/03 et un montant qui se cumule de jour en jour tout au long de l'année (revient à 0 chaque 01/04). Ensuite comme j'ai précisé ci-dessus, si cette valeur cumulée dépasse 6000000 pendant 7 jours alors il faut que je la réinitialise à 6000000 sur le 8e jour. De plus, si elle est > 0 pendant 30 jours alors elle revient à 0 sur le 31e.
    J'ai tenté une requête en positionnant des flags mais le problème c'est pour réinitialiser ces compteurs et mon cumul.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Re!

    Bon j'ai un peu avancé, je me suis lancé dans la création d'une procédure que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    CREATE OR REPLACE PROCEDURE GSA_BUN_REPORT_CALCULATION
    (
        out_cursor IN OUT rptcurspkg.t_cursor, 
        in_identifier IN VARCHAR, 
        in_start_date IN DATE, 
        in_end_date IN DATE
        )
    AS
    BEGIN
    BUN                 NUMBER;
    AGGREG_BUN          NUMBER;
    BUN_DAY_7           NUMBER;
    BUN_DAY_30          NUMBER;
     
    Cursor c_bun is  
    SELECT *
    FROM GSA_BUN_REPORT_EXTRACT
    WHERE DATE_STAMP BETWEEN in_start_date and in_end_date
    ORDER BY DATE_STAMP;
     
        BUN:=0;
        AGGREG_BUN:=0;
        BUN_DAY_7:=0;
        BUN_DAY_30:=0;
     
    For c_bun_r in c_bun loop
        BEGIN
        BUN := c_bun_r.daily_underdel - c_bun_r.daily_catchup;
        AGGREG_BUN := AGGREG_BUN + BUN;
        IF AGGREG_BUN > 6000000 
        THEN BUN_DAY_7:= BUN_DAY_7 + 1 ;
        ELSE BUN_DAY_7:= 0; 
        END IF;
        IF BUN_DAY_7=8
        THEN AGGREG_BUN := 6000000;
             BUN_DAY_7:= 0;
        END IF;
        IF AGGREG_BUN > 0 
        THEN BUN_DAY_30:= BUN_DAY_30 + 1 ;
        ELSE BUN_DAY_30:= 0; 
        END IF;
        IF BUN_DAY_30 = 31
        THEN AGGREG_BUN := 0;
             BUN_DAY_30:= 0;
        END IF;
    END LOOP;
     
    OPEN out_cursor FOR
    Par contre je me pose maintenant la question du retour des données. Comment je fais pour avoir une ligne par jour? Est ce que je suis obligé de passer par une table temporaire?

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Techniquement il est possible via des procédures pipelined mais il sera bien plus convenable pour vous d'essayer de répondre aux demandes que les deux autres intervenants vous en déjà faite:
    • fournir un jeux d'essaie
    • détailler les règles
    • montrer le résultat attendu

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Bonjour,

    Je n'ai pas de jeu d'essai. J'ai déjà détaillé les règles qui sont assez simples...

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par lolo6413 Voir le message
    Bonjour,

    Je n'ai pas de jeu d'essai. J'ai déjà détaillé les règles qui sont assez simples...
    Bonjour,

    Moi aussi je suis paresseux!

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Merci pour cette intervention enrichissante...
    Pour des réponses comme ça, pas besoin de venir sur mon sujet.

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par lolo6413 Voir le message
    Je n'ai pas de jeu d'essai.
    Alors c'est pas là qu'il faut commencer.
    vue la nature du problème, il faut un minimum de données pour couvrir tous les cas...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Citation Envoyé par lolo6413 Voir le message
    Re!

    Bon j'ai un peu avancé, je me suis lancé dans la création d'une procédure que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    CREATE OR REPLACE PROCEDURE GSA_BUN_REPORT_CALCULATION
    (
        out_cursor IN OUT rptcurspkg.t_cursor, 
        in_identifier IN VARCHAR, 
        in_start_date IN DATE, 
        in_end_date IN DATE
        )
    AS
    BEGIN
    BUN                 NUMBER;
    AGGREG_BUN          NUMBER;
    BUN_DAY_7           NUMBER;
    BUN_DAY_30          NUMBER;
     
    Cursor c_bun is  
    SELECT *
    FROM GSA_BUN_REPORT_EXTRACT
    WHERE DATE_STAMP BETWEEN in_start_date and in_end_date
    ORDER BY DATE_STAMP;
     
        BUN:=0;
        AGGREG_BUN:=0;
        BUN_DAY_7:=0;
        BUN_DAY_30:=0;
     
    For c_bun_r in c_bun loop
        BEGIN
        BUN := c_bun_r.daily_underdel - c_bun_r.daily_catchup;
        AGGREG_BUN := AGGREG_BUN + BUN;
        IF AGGREG_BUN > 6000000 
        THEN BUN_DAY_7:= BUN_DAY_7 + 1 ;
        ELSE BUN_DAY_7:= 0; 
        END IF;
        IF BUN_DAY_7=8
        THEN AGGREG_BUN := 6000000;
             BUN_DAY_7:= 0;
        END IF;
        IF AGGREG_BUN > 0 
        THEN BUN_DAY_30:= BUN_DAY_30 + 1 ;
        ELSE BUN_DAY_30:= 0; 
        END IF;
        IF BUN_DAY_30 = 31
        THEN AGGREG_BUN := 0;
             BUN_DAY_30:= 0;
        END IF;
    END LOOP;
     
    OPEN out_cursor FOR
    Par contre je me pose maintenant la question du retour des données. Comment je fais pour avoir une ligne par jour? Est ce que je suis obligé de passer par une table temporaire?
    Personne ne peut me répondre sur le moyen de ramener dans le out_cursor toutes les données calculées de la proc ci-dessus?

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par lolo6413 Voir le message
    Personne ne peut me répondre sur le moyen de ramener dans le out_cursor toutes les données calculées de la proc ci-dessus?
    Vous avez déjà eu deux solutions.
    ... passer par une table temporaire?
    Techniquement il est possible via des procédures pipelined...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Ok merci. Je vais donc chercher ce qu'est une procédure pipelined pour choisir entre les 2 solutions.

Discussions similaires

  1. Problème réinitialisation chaîne de caractères
    Par Ilyndril dans le forum LabVIEW
    Réponses: 2
    Dernier message: 27/04/2015, 15h31
  2. Réponses: 1
    Dernier message: 06/02/2012, 11h18
  3. [VxiR2] Problème de données cumulées ET mensuelles sur un graphique
    Par lolulola dans le forum Webi
    Réponses: 17
    Dernier message: 13/01/2012, 15h30
  4. Problème réinitialisation de données
    Par Shadow5 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/04/2008, 12h14
  5. Problème de somme cumulée
    Par CélineM dans le forum SAS Base
    Réponses: 15
    Dernier message: 31/03/2008, 19h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo