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

Designer Discussion :

Filtre sur une valeur maximale [V6]


Sujet :

Designer

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 34
    Points : 25
    Points
    25
    Par défaut Filtre sur une valeur maximale
    Bonjour,

    Je fais une requête qui doit me renvoyer les dernières valeurs entrées en prévision par un utilisateur.
    Je m'explique : chaque année, l'utilisateur peut saisir des prévisions. Pour une même année, il peut saisir plusieurs prévisions (identifiées par un champ CodePrevision). Seule la dernière prévision pour une année donnée m'intéresse.
    Filtrer l'année pour n'obtenir que les prévisions de cette année donnée ne pose pas de souci. Par contre, je veux faire un filtre sur du genre Max(CodePrevision) Pourchaque Utilisateur. Cette formule me permet d'afficher la valeur du CodePrevision qui m'intéresse, mais elle ne me permet pas de filtrer pour enlever les autres prévisions.
    J'ai déjà eu un problème similaire en voulant poser un filtre sur une date max mais si je veux utiliser cette solution, ça ne marche pas.

    Je crée un filtre dans mon univers :

    BE1D.PREVISION.DATECALCUL = (Select max(DATECALCUL) from BE1D.PREVISION X where X.CODEETABLISSEMENT=BE1D.PREVISION.CODEETABLISSEMENT)

    en m'inspirant de la solution trouvée la dernière fois.
    L'analyse me dit que c'est correct, mais quand je mets le filtre dans une requête, j'obtiens le message d'erreur suivant :

    SQL0104N Une marque inattendue "." figure à la suite de "SELECT FROM BE1D". Parmi les marques attendues, on trouve : "FROM". SQLSTATE=42601

    Et là, je sèche et je ne sais plus quoi faire...

    Merci d'avance pour le coup de main.

  2. #2
    Membre expérimenté
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Points : 1 458
    Points
    1 458
    Par défaut
    Bonjour,

    Je te conseille de passer par une table dérivée en utilisant la fonction RANK()
    En gros, ca donnerait qqch comme ca pour ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select RANK() OVER (PARTITION BY ANNEE,UTILISATEUR ORDER BY ID_PREVISION DESC) as  "Classement prévision" ,
    ANNEE,
    UTILISATEUR,
    ID_PREVISION
    from
    T1,
    T2,
    where
    T1.DIM1=T2.DIM1
    Tu vas alors avoir un classement qui va être réinitialisé pour chaque couple Année/utilisateur.
    Ce qui va te donner une table du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Classement / Année / Utilisateur / ID_prévision
    1 / 2010 / Dupont / 200
    2 / 2010 / Dupont / 199
    3 / 2010 / Dupont / 190
    1 / 2009 / Dupont / 200
    1 / 2010 / Durand / 200
    1 / 2009 / Durand / 200
    2 / 2009 / Durand / 150
    Etc etc...
    Il ne reste plus qu'à faire les jointures une fois que tu as cette table.
    Tu peux filtrer ta table sur Classement = 1 si tu le souhaites pour n'avoir que les dernières prévisions.

    Bon courage

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Merci !!
    Je ne connaissais pas la fonction RANK() et j'ai pu m'en sortir grâce à ça...

    Citation Envoyé par Julien59 Voir le message
    Bonjour,

    Je te conseille de passer par une table dérivée en utilisant la fonction RANK()
    En gros, ca donnerait qqch comme ca pour ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select RANK() OVER (PARTITION BY ANNEE,UTILISATEUR ORDER BY ID_PREVISION DESC) as  "Classement prévision" ,
    ANNEE,
    UTILISATEUR,
    ID_PREVISION
    from
    T1,
    T2,
    where
    T1.DIM1=T2.DIM1
    Tu vas alors avoir un classement qui va être réinitialisé pour chaque couple Année/utilisateur.
    Ce qui va te donner une table du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Classement / Année / Utilisateur / ID_prévision
    1 / 2010 / Dupont / 200
    2 / 2010 / Dupont / 199
    3 / 2010 / Dupont / 190
    1 / 2009 / Dupont / 200
    1 / 2010 / Durand / 200
    1 / 2009 / Durand / 200
    2 / 2009 / Durand / 150
    Etc etc...
    Il ne reste plus qu'à faire les jointures une fois que tu as cette table.
    Tu peux filtrer ta table sur Classement = 1 si tu le souhaites pour n'avoir que les dernières prévisions.

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtre sur une valeur minimum
    Par jejeaunet dans le forum SAS Base
    Réponses: 2
    Dernier message: 25/03/2015, 13h20
  2. [XL-2007] Filtre sur une ComboBox avec case cochée et les valeurs d'une colonne
    Par brunounours dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/11/2011, 09h17
  3. Réponses: 6
    Dernier message: 20/12/2010, 15h10
  4. Réponses: 0
    Dernier message: 09/09/2008, 14h12
  5. Filtre sur une liste de valeurs
    Par Death83 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/05/2006, 00h39

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