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

Aux pros de SQL (WD11 - HF classic)

6 réponses
Avatar
I.G.LOG
Bonjour à tous,
Je cherche à extraire les articles pour lequels il y a eu un mouvement de
stock (entrée ou sortie) durant une période.
J'ai deux table, DOCUMLG et MOUVEMENT comme suit:

DOCUMLG (table des articles)
IDDOCUMLG (ID primaire)
IDDOCUM
etc...

MOUVEMENT (table des mouvements de stock)
ORIGINE
DESTINATION
QTE
DATE

Dans la table MOUVEMENT,
Le champ ORIGINE contient l'identifiant IDDOCUMLG si c'est une sortie de
stock (mvt depuis DOCUMLG)
Le champ DESTINATION contient l'identifiant IDDOCUMLG si c'est une entrée en
stock (mvt vers DOCUMLG)

Voici la requete:

select
DOCUMLG.IDDOCUM,DOCUMLG.IDARTICLE,DOCUMLG.DESIGNATION,DOCUMLG.REFCONST,DOCUMLG.ETAT,
sum(ENTREE.QTE) as TotalEnt,
sum(SORTIE.QTE) as TotalSor
from
DOCUMLG left join MOUVEMENT as ENTREE on ENTREE.DESTINATION = IDDOCUMLG,
DOCUMLG left join MOUVEMENT as SORTIE on SORTIE.ORIGINE = IDDOCUMLG
where DOCUMLG.IDDOCUM = 75667 // ID du stock
and ENTREE.DATE between '20070101' and '20071001'
and SORTIE.DATE between '20070101' and '20071001'
group by REFCONST,ETAT,IDARTICLE,DESIGNATION,IDDOCUM

Cette requete fonctionne mais TotalEnt et TotalSor ont toujours la même
valeur ???!!!

Par ailleurs, je voudrais sélectionner seulement les articles pour lesquels
il y eu au moins un mouvement, c.a.d TotalEnt > 0 OU TotalSor > 0;
Pour ça, j'ai rajouté la clause suivante:

having (TotalEnt > 0 or TotalSor > 0)

La requete fonctionne avec SQLExec mais me retourne des tuples avec les deux
qtés à zéro !
Si j'exécute cette requete avec WDSQL, j'ai un message d'erreur sur le OR !

Merci à tous pour votre aide

6 réponses

Avatar
I.G.LOG
Aucune réponse ! Personne n'a d'idée sur ce problème ? Une suggestion serait
bien venue
Avatar
mat
I.G.LOG wrote:
...
Voici la requete:

select
DOCUMLG.IDDOCUM,DOCUMLG.IDARTICLE,DOCUMLG.DESIGNATION,DOCUMLG.REFCONST,DOCUMLG.ETAT,
sum(ENTREE.QTE) as TotalEnt,
sum(SORTIE.QTE) as TotalSor
from
DOCUMLG left join MOUVEMENT as ENTREE on ENTREE.DESTINATION = IDDOCUMLG,
DOCUMLG left join MOUVEMENT as SORTIE on SORTIE.ORIGINE = IDDOCUMLG
where DOCUMLG.IDDOCUM = 75667 // ID du stock
and ENTREE.DATE between '20070101' and '20071001'
and SORTIE.DATE between '20070101' and '20071001'
group by REFCONST,ETAT,IDARTICLE,DESIGNATION,IDDOCUM



...

Bonsoir,

je n'ai que WD10 et sous cette version le code ci-dessus aurait comme
problème le LEFT JOIN QUE j'essayerais DE résoudre avec "INNER JOIN".

Pour l'autre problème, je ferais

" HAVING (TotalEnt+TotalSor) <> 0 "


Salutations
Mat
Avatar
mat
mat wrote:
...

" HAVING (TotalEnt+TotalSor) <> 0 "




j'ai eu un doute sur le code du HAVING (que je n'utilise pas souvent).
Dans mes requêtes je répète le SUM du SELECT (syntaxe confirmé par un
guide SQL), donc

" HAVING sum(ENTREE.QTE)+sum(SORTIE.QTE) <> 0 "
Avatar
I.G.LOG
> je n'ai que WD10 et sous cette version le code ci-dessus aurait comme
problème le LEFT JOIN QUE j'essayerais DE résoudre avec "INNER JOIN".

Pour l'autre problème, je ferais

" HAVING (TotalEnt+TotalSor) <> 0 "



Bonjour,
Avec inner join, la requete ne me retournerais pas les tuples qui n'ont pas
de sortie OU pas d'entrée (contrairement au letf join qui va me retourner
ceux qui ont une QTE à 0) ?!
J'ai aussi essayé de mettre les sum(QTE) dans la clause having, sans succès.
Merci pour l'idée de having(TotalEnt+TotalSor) qui semble fonctionner.
Bon. dev
Phil
Avatar
mat
I.G.LOG wrote:
Bonjour,
Avec inner join, la requete ne me retournerais pas les tuples qui n'ont pas
de sortie OU pas d'entrée (contrairement au letf join qui va me retourner
ceux qui ont une QTE à 0) ?!



On voit que je ne suis pas un pro de l'SQL, mais on y arrive normalement
aussi :-)

Juste pour mon intérêt, est-ce-que j'ai bien compris le paragraphe
suivant que toute la requête fonctionne maintenant avec LEFT JOIN?
Car sous WD10 il faudrait utiliser LEFT OUTER JOIN pour que ça donne ce
résultat.

J'ai aussi essayé de mettre les sum(QTE) dans la clause having, sans succès.
Merci pour l'idée de having(TotalEnt+TotalSor) qui semble fonctionner.




Salutations
Mat
Avatar
I.G.LOG
> Juste pour mon intérêt, est-ce-que j'ai bien compris le paragraphe suivant
que toute la requête fonctionne maintenant avec LEFT JOIN?
Car sous WD10 il faudrait utiliser LEFT OUTER JOIN pour que ça donne ce
résultat.



En WD11 LEFT JOIN fonctionne ! je vais quand même vérifier si les deux
syntaxes donnent des résultats identiques (ça devrait !!)