Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses
Avatar
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

5 réponses

Avatar
Michel__D
Bonjour,

"Thierry.E" <aucune_at_aucune.fr> a écrit dans le message de news:
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 <> '' AND B.StockFictif <> 'O';
Avatar
Thierry.E
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
<> '' AND B.StockFictif <> 'O' ORDER BY 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 <> '' AND B.StockFictif <> 'O' GROUP 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


"Michel__D" a écrit dans le message de
news: h6gm5p$tts$
Bonjour,

"Thierry.E" <aucune_at_aucune.fr> a écrit dans le message de news:

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 <> '' AND B.StockFictif <> 'O';



Avatar
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
<> '' AND B.StockFictif <> 'O' ORDER BY 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 <> '' AND B.StockFictif <> 'O' GROUP 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
Avatar
Thierry.E
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" a écrit dans le message de news:

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 <> '' AND B.StockFictif <> 'O' ORDER BY
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 <> '' AND B.StockFictif <> 'O' GROUP
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



Avatar
db
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...