Utilisation de MAX en sous requette

miikado69 Messages postés 11 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 15 avril 2012 - 29 août 2010 à 15:23
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 31 août 2010 à 09:14
Bonjour,voici une requette qui ne fonctionne pas ce qui m'etonne pas vu que je ne suis pas très fort en SQL.

Je veux récupérer la valeur la plus haute de 'Transfert' par rapport à la valeur 'SolutionID' qui elle change suivant une sélection.
SELECT SolutionID, Transfert (
FROM TABLE_TRANSFERTSOLUTION
WHERE SolutionID = @SolutionID)
GROUP BY Transfert
HAVING (Transfert =(SELECT MAX(Transfert) AS Expr1 FROM TABLE_TRANSFERTSOLUTION AS TABLE_TRANSFERTSOLUTION_1))

voici l'erreur,
la colonne 'TABLE_TRANSFERTSOLUTION.SolutionID' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans une clause GROUPE BY
En espérant avoir été clair, merci de votre aide.
Miikado

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 août 2010 à 20:07
Salut

L'erreur est dû à l'utilisation de parenthèses au mauvais endroit, devant le FROM = inutiles et bloquantes/buggantes
Cette syntaxe marchera surement mieux :
SELECT SolutionID, Transfert
FROM TABLE_TRANSFERTSOLUTION
WHERE SolutionID = @SolutionID
GROUP BY Transfert
HAVING (Transfert =(SELECT MAX(Transfert) AS Expr1 FROM TABLE_TRANSFERTSOLUTION AS TABLE_TRANSFERTSOLUTION_1))

Le GROUP BY n'est pas utile (puisque'il n'y aura qu'un seul MAX) et je ne suis pas certain qu'il soit autorisé en même temps que HAVING.

Autre syntaxe possible, je pense :
SELECT SolutionID, Transfert
FROM TABLE_TRANSFERTSOLUTION
WHERE SolutionID = @SolutionID
AND Transfert = (SELECT MAX(Transfert) AS Expr1 FROM TABLE_TRANSFERTSOLUTION AS TABLE_TRANSFERTSOLUTION_1))

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
miikado69 Messages postés 11 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 15 avril 2012
30 août 2010 à 11:44
Bonjour merci pour la réponse mais ça ce fonctionne pas (les 2).
mais j'ai fini par trouver:
SELECT MAX(Transfert) AS Expr1
FROM (SELECT SolutionID, Transfert FROM TABLE_TRANSFERTSOLUTION
WHERE (SolutionID = @SolutionID)) AS derivedtbl_1
Je retrouve bien la bonne valeur dans mon code vb, par contre il me met une erreur lorsqu'il trouve une valeur null et
IsDBNull(row.Expr1) et
If Not DBNull.Value.Equals(row.Expr1) ne bloque pas l'erreur,si on peu m'aider.
Miikado
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 août 2010 à 09:14
Surprenant que cette syntaxe fonctionne.
Un SELECT en guise de clause FROM, ça m'épate.

Un NULL sur quel champ ?
Erreur ? Laquelle ? lors de la requète ou après, dans ton programme ?
Pourquoi "row.Expr1" ? Tu travailles sur quel type d'objet ?
0
Rejoignez-nous