[requête] Problème avec Distinct et Order by

Le
Thierry.E
Bonjour,

Sur une base de donnée Access, je programme une macro VBA Excel. Je
rencontre un problème de compatibilité entre l'instruction DISTINCT et ORDER
BY. La requête que j'exécute est la suivante :

Select DISTINCT trim(A.CodeArticlePrincipal) As CodeArtP,
trim(A.RefArtPrincipal) As RefArtP, trim(B.LibelleArticle) As Desig,
B.CodeFamilleArticle As Fam, trim(B.CodeSousFamilleArticle) As SsFam,
trim(B.StockFictif) As Fictif FROM Nomenclatures as A, Articles As B WHERE
A.RefArtPrincipal = B.RefArticle AND A.RefArtPrincipal <> '' AND
B.StockFictif <> 'O' ORDER BY Fam ASC;

Le message d'erreur est le suivant : "La clause ORDER BY (Fam) est en
conflit avec DISTINCT." J'ai essayé pas mal d'autres critères de tri sans
succès. En fait, dès que je met un critère de tri, j'ai le même message
d'erreur. Par contre, si je ne met pas de clause de tri, la requête marche
parfaitement.

Merci par avance pour votre aide, je suis totalement perdu

Thierry
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michel__D
Le #19952961
Bonjour,

"Thierry.E"
Bonjour,

Sur une base de donnée Access, je programme une macro VBA Excel. Je rencontre un problème de compatibilité entre l'instruction
DISTINCT et ORDER BY. La requête que j'exécute est la suivante :

Select DISTINCT trim(A.CodeArticlePrincipal) As CodeArtP, trim(A.RefArtPrincipal) As RefArtP, trim(B.LibelleArticle) As Desig,
B.CodeFamilleArticle As Fam, trim(B.CodeSousFamilleArticle) As SsFam, trim(B.StockFictif) As Fictif FROM Nomenclatures as A,
Articles As B WHERE A.RefArtPrincipal = B.RefArticle AND A.RefArtPrincipal
Le message d'erreur est le suivant : "La clause ORDER BY (Fam) est en conflit avec DISTINCT." J'ai essayé pas mal d'autres
critères de tri sans succès. En fait, dès que je met un critère de tri, j'ai le même message d'erreur. Par contre, si je ne met
pas de clause de tri, la requête marche parfaitement.

Merci par avance pour votre aide, je suis totalement perdu...

Thierry



Essaye avec cette formulation :

SELECT Trim(A.CodeArticlePrincipal) As CodeArtP,
Trim(A.RefArtPrincipal) As RefArtP, Trim(B.LibelleArticle) As Desig,
B.CodeFamilleArticle As Fam, Trim(B.CodeSousFamilleArticle) As SsFam,
Trim(B.StockFictif) As Fictif
FROM Nomenclatures as A INNER JOIN Articles As B
ON A.RefArtPrincipal = B.RefArticle
GROUP BY Trim(A.CodeArticlePrincipal), Trim(A.RefArtPrincipal),
Trim(B.LibelleArticle), B.CodeFamilleArticle, Trim(B.CodeSousFamilleArticle),
Trim(B.StockFictif)
ORDER BY B.CodeFamilleArticle
HAVING A.RefArtPrincipal
Thierry.E
Le #19954131
Re-bonjour et merci pour votre réponse et éclairages. J'ai exécuté votre
requête mais rencontre un nouveau problème qui m'échappe.

Lorsque je lance la requête suivante :
SELECT Trim(A.CodeArticlePrincipal) As CodeArtP, Trim(A.RefArtPrincipal) As
RefArtP, Trim(B.LibelleArticle) As Desig, B.CodeFamilleArticle As Fam,
Trim(B.CodeSousFamilleArticle) As SsFam, Trim(B.StockFictif) As Fictif FROM
Nomenclatures as A INNER JOIN Articles As B ON A.RefArtPrincipal =
B.RefArticle GROUP BY Trim(A.CodeArticlePrincipal), Trim(A.RefArtPrincipal),
Trim(B.LibelleArticle), B.CodeFamilleArticle,
Trim(B.CodeSousFamilleArticle), Trim(B.StockFictif) HAVING A.RefArtPrincipal
j'ai ce message d'erreur : Vous avez essayé d'exécuter une requête ne
comprenant pas l'expression spécifiée 'Not A.RefArtPrincipal='' And Not
B.StockFictif='O'' comme une partie de la fonction d'agrégat.

Alors que si je remplace HAVING par WHERE cela fonctionne parfaitement (même
si j'ai bien compris que ce n'était pas grammaticalement correct).
SELECT Trim(A.CodeArticlePrincipal) As CodeArtP, Trim(A.RefArtPrincipal) As
RefArtP, Trim(B.LibelleArticle) As Desig, B.CodeFamilleArticle As Fam,
Trim(B.CodeSousFamilleArticle) As SsFam, Trim(B.StockFictif) As Fictif FROM
Nomenclatures as A INNER JOIN Articles As B ON A.RefArtPrincipal =
B.RefArticle WHERE A.RefArtPrincipal Trim(A.CodeArticlePrincipal), Trim(A.RefArtPrincipal),
Trim(B.LibelleArticle), B.CodeFamilleArticle,
Trim(B.CodeSousFamilleArticle), Trim(B.StockFictif) ORDER BY
B.CodeFamilleArticle;


J'en perd mon latin.
Thierry


"Michel__D" news: h6gm5p$tts$
Bonjour,

"Thierry.E"
Bonjour,

Sur une base de donnée Access, je programme une macro VBA Excel. Je
rencontre un problème de compatibilité entre l'instruction DISTINCT et
ORDER BY. La requête que j'exécute est la suivante :

Select DISTINCT trim(A.CodeArticlePrincipal) As CodeArtP,
trim(A.RefArtPrincipal) As RefArtP, trim(B.LibelleArticle) As Desig,
B.CodeFamilleArticle As Fam, trim(B.CodeSousFamilleArticle) As SsFam,
trim(B.StockFictif) As Fictif FROM Nomenclatures as A, Articles As B
WHERE A.RefArtPrincipal = B.RefArticle AND A.RefArtPrincipal <> '' AND
B.StockFictif <> 'O' ORDER BY Fam ASC;

Le message d'erreur est le suivant : "La clause ORDER BY (Fam) est en
conflit avec DISTINCT." J'ai essayé pas mal d'autres critères de tri sans
succès. En fait, dès que je met un critère de tri, j'ai le même message
d'erreur. Par contre, si je ne met pas de clause de tri, la requête
marche parfaitement.

Merci par avance pour votre aide, je suis totalement perdu...

Thierry



Essaye avec cette formulation :

SELECT Trim(A.CodeArticlePrincipal) As CodeArtP,
Trim(A.RefArtPrincipal) As RefArtP, Trim(B.LibelleArticle) As Desig,
B.CodeFamilleArticle As Fam, Trim(B.CodeSousFamilleArticle) As SsFam,
Trim(B.StockFictif) As Fictif
FROM Nomenclatures as A INNER JOIN Articles As B
ON A.RefArtPrincipal = B.RefArticle
GROUP BY Trim(A.CodeArticlePrincipal), Trim(A.RefArtPrincipal),
Trim(B.LibelleArticle), B.CodeFamilleArticle,
Trim(B.CodeSousFamilleArticle),
Trim(B.StockFictif)
ORDER BY B.CodeFamilleArticle
HAVING A.RefArtPrincipal


db
Le #19955201
Thierry.E a écrit :
Re-bonjour et merci pour votre réponse et éclairages. J'ai exécuté votre
requête mais rencontre un nouveau problème qui m'échappe.

Lorsque je lance la requête suivante :
SELECT Trim(A.CodeArticlePrincipal) As CodeArtP, Trim(A.RefArtPrincipal) As
RefArtP, Trim(B.LibelleArticle) As Desig, B.CodeFamilleArticle As Fam,
Trim(B.CodeSousFamilleArticle) As SsFam, Trim(B.StockFictif) As Fictif FROM
Nomenclatures as A INNER JOIN Articles As B ON A.RefArtPrincipal =
B.RefArticle GROUP BY Trim(A.CodeArticlePrincipal), Trim(A.RefArtPrincipal),
Trim(B.LibelleArticle), B.CodeFamilleArticle,
Trim(B.CodeSousFamilleArticle), Trim(B.StockFictif) HAVING A.RefArtPrincipal
j'ai ce message d'erreur : Vous avez essayé d'exécuter une requête ne
comprenant pas l'expression spécifiée 'Not A.RefArtPrincipal='' And Not
B.StockFictif='O'' comme une partie de la fonction d'agrégat.

Alors que si je remplace HAVING par WHERE cela fonctionne parfaitement (même
si j'ai bien compris que ce n'était pas grammaticalement correct).
SELECT Trim(A.CodeArticlePrincipal) As CodeArtP, Trim(A.RefArtPrincipal) As
RefArtP, Trim(B.LibelleArticle) As Desig, B.CodeFamilleArticle As Fam,
Trim(B.CodeSousFamilleArticle) As SsFam, Trim(B.StockFictif) As Fictif FROM
Nomenclatures as A INNER JOIN Articles As B ON A.RefArtPrincipal =
B.RefArticle WHERE A.RefArtPrincipal Trim(A.CodeArticlePrincipal), Trim(A.RefArtPrincipal),
Trim(B.LibelleArticle), B.CodeFamilleArticle,
Trim(B.CodeSousFamilleArticle), Trim(B.StockFictif) ORDER BY
B.CodeFamilleArticle;


J'en perd mon latin.
Thierry




Bonsoir,

Non seulement c'est grammaticalement correct, mais en plus il n'y a pas
vraiment de raison de mettre HAVING qui sert essentiellement à poser une
condition sur une - ou plusieurs - fonction(s) d'agrégat.
Ici, le GROUP BY lui-même ne me paraît pas essentiel, mais c'est
peut-être une méthode pour contourner votre problème de tri. Par
curiosité, vous pourriez essayer de le supprimer en gardant le reste de
la requête proposée par Michel_D (et en remplaçant le HAVING par le
WHERE comme vous l'avez fait).

Bien amicalement,

db
Thierry.E
Le #19959461
Bonjour et merci pour ta réponse.

Dans mon cas le group by est utile afin de ne pas avoir plusieurs occurences
pour une seule référence qui est présente plusieurs fois dans la base.

Sympathiquement,
Thierry

"db"
Thierry.E a écrit :
Re-bonjour et merci pour votre réponse et éclairages. J'ai exécuté votre
requête mais rencontre un nouveau problème qui m'échappe.

Lorsque je lance la requête suivante :
SELECT Trim(A.CodeArticlePrincipal) As CodeArtP, Trim(A.RefArtPrincipal)
As RefArtP, Trim(B.LibelleArticle) As Desig, B.CodeFamilleArticle As Fam,
Trim(B.CodeSousFamilleArticle) As SsFam, Trim(B.StockFictif) As Fictif
FROM Nomenclatures as A INNER JOIN Articles As B ON A.RefArtPrincipal =
B.RefArticle GROUP BY Trim(A.CodeArticlePrincipal),
Trim(A.RefArtPrincipal), Trim(B.LibelleArticle), B.CodeFamilleArticle,
Trim(B.CodeSousFamilleArticle), Trim(B.StockFictif) HAVING
A.RefArtPrincipal B.CodeFamilleArticle;
j'ai ce message d'erreur : Vous avez essayé d'exécuter une requête ne
comprenant pas l'expression spécifiée 'Not A.RefArtPrincipal='' And Not
B.StockFictif='O'' comme une partie de la fonction d'agrégat.

Alors que si je remplace HAVING par WHERE cela fonctionne parfaitement
(même si j'ai bien compris que ce n'était pas grammaticalement correct).
SELECT Trim(A.CodeArticlePrincipal) As CodeArtP, Trim(A.RefArtPrincipal)
As RefArtP, Trim(B.LibelleArticle) As Desig, B.CodeFamilleArticle As Fam,
Trim(B.CodeSousFamilleArticle) As SsFam, Trim(B.StockFictif) As Fictif
FROM Nomenclatures as A INNER JOIN Articles As B ON A.RefArtPrincipal =
B.RefArticle WHERE A.RefArtPrincipal BY Trim(A.CodeArticlePrincipal), Trim(A.RefArtPrincipal),
Trim(B.LibelleArticle), B.CodeFamilleArticle,
Trim(B.CodeSousFamilleArticle), Trim(B.StockFictif) ORDER BY
B.CodeFamilleArticle;


J'en perd mon latin.
Thierry




Bonsoir,

Non seulement c'est grammaticalement correct, mais en plus il n'y a pas
vraiment de raison de mettre HAVING qui sert essentiellement à poser une
condition sur une - ou plusieurs - fonction(s) d'agrégat.
Ici, le GROUP BY lui-même ne me paraît pas essentiel, mais c'est peut-être
une méthode pour contourner votre problème de tri. Par curiosité, vous
pourriez essayer de le supprimer en gardant le reste de la requête
proposée par Michel_D (et en remplaçant le HAVING par le WHERE comme vous
l'avez fait).

Bien amicalement,

db



db
Le #19964781
Thierry.E a écrit :
Bonjour et merci pour ta réponse.

Dans mon cas le group by est utile afin de ne pas avoir plusieurs occurences
pour une seule référence qui est présente plusieurs fois dans la base.



Oui, j'ai oublié de préciser qu'il fallait remettre le DISTINCT...
Publicité
Poster une réponse
Anonyme