Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > Business Objects > Designer
Designer Forum d'entraide Designer (création d'univers, etc.)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2010, 15h57   #1
Invité régulier
 
Inscription : mai 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 22
Points : 6
Points : 6
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.
Fox1977 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 16h12   #2
Modérateur
 
Avatar de Julien59
 
Julien Lizzul
Inscription : mars 2008
Messages : 1 103
Détails du profil
Informations personnelles :
Nom : Julien Lizzul
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : mars 2008
Messages : 1 103
Points : 1 295
Points : 1 295
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 :
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 :
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
__________________
  • Pensez à consulter la FAQ BO
  • Quand votre problème est solutionné, n'oubliez pas de cliquer sur le bouton
Julien59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 16h43   #3
Invité régulier
 
Inscription : mai 2009
Messages : 22
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 22
Points : 6
Points : 6
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 :
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 :
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
Fox1977 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h43.


 
 
 
 
Partenaires

Hébergement Web