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

Langage SQL Discussion :

Combler des trous avec la valeur précédente


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut Combler des trous avec la valeur précédente
    Bonjour,

    j'ai un problème sur lequel j'espère que vous pourrez m'aider.

    j'ai une table oracle dans laquelle j'ai des données de ce type :

    numéro de dossier, garantie, année, montant

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    51000, AB, 2005, null
    51000, AB, 2006, 205
    51000, AB, 2007, null
    51000, AB, 2008, null
    51000, AB, 2009, 1223
    51000, AB, 2010, null
    51000, AB, 2011, null
    Pour les montants pour lesquels j'ai null, je dois reprendre le montant précédent uniquement s'il est non null, soit obtenir le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    51000, AB, 2005, null
    51000, AB, 2006, 205
    51000, AB, 2007, 205
    51000, AB, 2008, 205
    51000, AB, 2009, 1223
    51000, AB, 2010, 1223
    51000, AB, 2011, 1223
    Je dois faire ça avec une requête sql. J'avais pensé à la fonction LAG mais ca ne marche pas car ca reprend qu'une seule fois la valeur.
    Merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 736
    Points
    39 736
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Utilisez la fonction coalesce qui permet de récupérer la 1ère valeur non nulle d'une liste

  3. #3
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
        num, 
        garantie,
        annee,
        LAST_VALUE(montant IGNORE NULLS) OVER(ORDER BY annee) 
    FROM  LaTable
    En ajoutant une clause de partitionnement le cas échéant

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 340
    Points : 39 736
    Points
    39 736
    Billets dans le blog
    9
    Par défaut
    J'étais parti sur du plus classique, qui semble fonctionner aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       SELECT DISTINCT A.DOSSIER, A.GARANTIE, A.ANNEE,         
                       COALESCE(A.MONTANT, B.MONTANT)              
       FROM DD0Q.TBB0 A                                      
       LEFT OUTER JOIN                                       
           (SELECT DOSSIER, GARANTIE, ANNEE, MONTANT              
            FROM DD0Q.TBB0                                   
            WHERE MONTANT IS NOT NULL                           
            ORDER BY DOSSIER ASC, GARANTIE ASC, ANNEE DESC) B  
       ON  B.DOSSIER  = A.DOSSIER                               
       AND B.GARANTIE = A.GARANTIE
    Je ne sais pas du tout quel plan d'exécution résulte de la technique Last_value ce serait intéressant de comparer

Discussions similaires

  1. Remplacement des cellules par la valeur précédente
    Par gwirionez dans le forum SAS Base
    Réponses: 2
    Dernier message: 27/07/2011, 08h51
  2. Réponses: 5
    Dernier message: 22/07/2010, 16h19
  3. [griddata] Combler des trous d'interpolation
    Par raceng dans le forum MATLAB
    Réponses: 4
    Dernier message: 09/06/2009, 11h05
  4. Visionner des images avec suivant et précédent
    Par punisher999 dans le forum AWT/Swing
    Réponses: 14
    Dernier message: 13/05/2008, 04h47
  5. Réponses: 5
    Dernier message: 26/04/2007, 09h29

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