OVH Cloud OVH Cloud

Requetes imbriquées a tirer par les cheveux

11 réponses
Avatar
aitoz
Bonjour,

Je voudrais calculer le taux de rotation de mes stocks exprimé en nombres de
mois !

Actuellement, j'ai développer en ACCESS un petit programme qui
successivement,
va coller dans une table temporaire la somme des stocks par localisation et
par famille d'article.
Ensuite en parallèle, je fais la somme des articles expédiés sur une période
exprimé en mois.
Et pour finir je regroupe le tout dans une ultime requete qui me donne le
niveau de stock et la qte expédiée et avec ca je peux calculer mon niveau de
stock en mois !

J'ai pour ce faire 5 étapes (soit 5 requetes) !
2 pour avoir les infos sur les stocks
2 pour avoir les infos sur les expéditions
1 la finale pour regrouper le tout !

Comment je pourrais faire pour écrire tout cela en une pièce ?
Est-ce possible ?

Merci

Laurent

10 réponses

1 2
Avatar
aitoz
J'ai reussi a regrouper pas mal de choses !
J'ai maintenant plus que deux requetes.
J'ai une requetes principale qui regroupe mes quantittés en stock par
famille d'article et par plage de localisation.
J'ai une autre requete qui fait la meme chose avec les expéditions.
Maintenant, j'arrive dans ACCESS a ajouter le resultat de la deuxième à la
première.
Mais le probleme est que j'arrive a faire cela en deux requetes dans ACCESS
!
Comment regrouper en une seule ???

Parce que je sais faire une requete imbriquée quand il s'agit d'exploiter le
résultat d'une requete pour en créer une autre !
Mais la, mon probleme est que je ne veux pas exploiter le resultat mais
simplement afficher les données. Comme si je faisais un lien entre deux
table ! mettre bout a bout le listing des stocks et en face mettre les qté
expédiées !
Avatar
aitoz
Voici ma requete :
J'aimerai qu'il n'y ai plus le lien avec la sous requete8 !
Et comme ca, j'aurai une seule et meme requete, d'un seul tenant !

SELECT GPEVSTOC.ES_CART, GPARTICL.AR_DES1, GPEVSTOC.ES_LOCA,
GPEVSTOC.ES_NLOT, GPEVSTOC.ES_QSTO, GPARTICL.AR_PMPO, [ES_QSTO]*[AR_PMPO] AS
VALO, GPEVSTOC.ES_CMOU, GPEVSTOC.ES_DATE,
IIf([ES_LOCA]<="A01A01","SECTEUR SOUS-TRAITANCE",
IIf([ES_LOCA]<="B01AF4","SECTEUR FERROVIAIRE",
IIf([ES_LOCA]<="B01AL4","SECTEUR AUTOMOBILE",
IIf([ES_LOCA]<="B01AU4","SECTEUR AVIATION",
IIf([ES_LOCA]<="B01BA4","SECTEUR MORT FERRO",
IIf([ES_LOCA]<="B01BJ4","SECTEUR MORT NEGOCE",
IIf([ES_LOCA]<="ZBOF","SECTEUR NEGOCE",
"ERREUR"))))))) AS POLE,
Requête8.SommeDeEX_NBRE, Requête8.DernierDeEX_DMOU,
[SommeDeEX_NBRE]/Fix(((#4/30/2005#-#1/1/2002#)/30)) AS [QTE EXP MOY],
Fix(((#4/30/2005#-#1/1/2002#)/30)) AS [NB MOIS],
[ES_QSTO]/[QTE EXP MOY] AS ROTATION,
IIf([rotation] Is Null,"STOCK MORT",
IIf([rotation]<=3,"Stocks à 3 mois",
IIf([rotation]<=6,"Stocks à 6 mois",
IIf([rotation]<,"Stocks à 12 mois",
IIf([rotation]<$,"Stocks à 24 mois",
IIf([rotation]<6,"Stocks à 36 mois",
IIf([rotation]<H,"Stocks à 48 mois",
IIf([rotation]<`,"Stocks à 60 mois",
IIf([rotation]<0,"Stocks à 120 mois",
IIf([rotation]>120,"Stocks > 120 mois")))))))))) AS ETAT
FROM (GPEVSTOC LEFT JOIN GPARTICL ON GPEVSTOC.ES_CART = GPARTICL.AR_CODE)
LEFT JOIN Requête8 ON GPEVSTOC.ES_CART = Requête8.EX_ARTI
WHERE (((GPEVSTOC.ES_CART) Between "$00000000000" And "£ZZZZZZZZZZZZ") AND
((GPEVSTOC.ES_LOCA) Between "00000000" And "ZBOF") AND
((GPEVSTOC.ES_CMOU)="FIN"));

Et ca, ca marche super bien !
Mais comment tout faire en une seule requete ????

Merci de votre aide !
Avatar
Patrice
Le plus direct serait de remplacer Requêtes 8 par une sous-requête (y copier
le code SQL) : FROM (SELECT *...) si tant est que Access le permette...

Pour Access, utiliser peut-être un groupe plus adapté (celui ci est consacré
à SQL Server).
Performances égales par ailleurs, le fait de diviser en étapes peut
éventuellement être plus clair. Je crains que la requête finisse par être
unique mais difficile à modifier.

A brûle pourpoint j'aurais vu quelque chose comme une somme avec les entrées
en + et les sorties en - (éventuellement avec une requête UNION ???)

Bonne continuation.

Patrice

--

"aitoz" a écrit dans le message de
news:
Voici ma requete :
J'aimerai qu'il n'y ai plus le lien avec la sous requete8 !
Et comme ca, j'aurai une seule et meme requete, d'un seul tenant !

SELECT GPEVSTOC.ES_CART, GPARTICL.AR_DES1, GPEVSTOC.ES_LOCA,
GPEVSTOC.ES_NLOT, GPEVSTOC.ES_QSTO, GPARTICL.AR_PMPO, [ES_QSTO]*[AR_PMPO]


AS
VALO, GPEVSTOC.ES_CMOU, GPEVSTOC.ES_DATE,
IIf([ES_LOCA]<="A01A01","SECTEUR SOUS-TRAITANCE",
IIf([ES_LOCA]<="B01AF4","SECTEUR FERROVIAIRE",
IIf([ES_LOCA]<="B01AL4","SECTEUR AUTOMOBILE",
IIf([ES_LOCA]<="B01AU4","SECTEUR AVIATION",
IIf([ES_LOCA]<="B01BA4","SECTEUR MORT FERRO",
IIf([ES_LOCA]<="B01BJ4","SECTEUR MORT NEGOCE",
IIf([ES_LOCA]<="ZBOF","SECTEUR NEGOCE",
"ERREUR"))))))) AS POLE,
Requête8.SommeDeEX_NBRE, Requête8.DernierDeEX_DMOU,
[SommeDeEX_NBRE]/Fix(((#4/30/2005#-#1/1/2002#)/30)) AS [QTE EXP MOY],
Fix(((#4/30/2005#-#1/1/2002#)/30)) AS [NB MOIS],
[ES_QSTO]/[QTE EXP MOY] AS ROTATION,
IIf([rotation] Is Null,"STOCK MORT",
IIf([rotation]<=3,"Stocks à 3 mois",
IIf([rotation]<=6,"Stocks à 6 mois",
IIf([rotation]<,"Stocks à 12 mois",
IIf([rotation]<$,"Stocks à 24 mois",
IIf([rotation]<6,"Stocks à 36 mois",
IIf([rotation]<H,"Stocks à 48 mois",
IIf([rotation]<`,"Stocks à 60 mois",
IIf([rotation]<0,"Stocks à 120 mois",
IIf([rotation]>120,"Stocks > 120 mois")))))))))) AS ETAT
FROM (GPEVSTOC LEFT JOIN GPARTICL ON GPEVSTOC.ES_CART = GPARTICL.AR_CODE)
LEFT JOIN Requête8 ON GPEVSTOC.ES_CART = Requête8.EX_ARTI
WHERE (((GPEVSTOC.ES_CART) Between "$00000000000" And "£ZZZZZZZZZZZZ") AND
((GPEVSTOC.ES_LOCA) Between "00000000" And "ZBOF") AND
((GPEVSTOC.ES_CMOU)="FIN"));

Et ca, ca marche super bien !
Mais comment tout faire en une seule requete ????

Merci de votre aide !




Avatar
aitoz
Je viens ici parce je ne connais pas de forum SQL pure !
Je ne suis meme pas sur que ca existe. Mon probleme est un probleme de SQL.
Si j'avais SQL Server j'irai vers les procédures stockées, mais ce n'est pas
le cas !

Mais merci, je vais essayer de nouveau d'integrer la requete SQL à la place
de requete8.
UNION, je connais et je n'y avais pas pensé. Je vais regarder.

Merci pour votre aide
Avatar
aitoz
Non, en fait, UNION affiche a la suite deux requetes !
Ca ne conviens pas !
Il faut que je fasse un select imbriqué a un niveau encore supplémentaire !
Je touche au but. Dès que j'ai trouvé je mets la réponse.
Si quelqu'un a une autre idée ? ou meme la réponse je serais ravi.

Merci et bonne soirée
Avatar
Michel PRIORI
Je n'ai rien compris, mais il me semble qu'à peu de frais de conception tu
peux utiliser les vues (voir create vue dans SQL) ou des requêtes
(fichier/enregistrer dans access)

Si ton problème est une analyse multidimentionnelle le principe OLAP devrait
t'interresser (voir analyse de tableau croisé dans Acccess. Plus pauvre)

"aitoz" a écrit :

Bonjour,

Je voudrais calculer le taux de rotation de mes stocks exprimé en nombres de
mois !

Actuellement, j'ai développer en ACCESS un petit programme qui
successivement,
va coller dans une table temporaire la somme des stocks par localisation et
par famille d'article.
Ensuite en parallèle, je fais la somme des articles expédiés sur une période
exprimé en mois.
Et pour finir je regroupe le tout dans une ultime requete qui me donne le
niveau de stock et la qte expédiée et avec ca je peux calculer mon niveau de
stock en mois !

J'ai pour ce faire 5 étapes (soit 5 requetes) !
2 pour avoir les infos sur les stocks
2 pour avoir les infos sur les expéditions
1 la finale pour regrouper le tout !

Comment je pourrais faire pour écrire tout cela en une pièce ?
Est-ce possible ?

Merci

Laurent





Avatar
aitoz
merci.
Pour simplifer les choses ! Voici mo probleme simplifier :

J'ai une table STOCK et une table EXPEDITION
Avec chacune deux champs : Code_article et Qté

Ma requete SQL sera :
SELECT stock.Code_article, stock.Qté, expedition.qté
FROM stock LEFT JOIN expedition ON
stock.Code_article=expedition.Code_article;

Le probleme est que la je n'ai pas la somme des quantités livrées sur une
période !
le champ expédition.qté doit être le fruit d'une requete imbriquée me
donnant la somme des quantités expédiées sur une période !
Avatar
Patrice
Le UNION te donne UN résultat sur lequel tu dois pouvoir ensuite opérer une
somme et un group by ? Après je ne ne connais pas le détail de tes données
mais globalement je pensais à quelque chose comme :

SELECT Produit,SUM(Quantité) FROM
(
SELECT Produit,Quantité FROM Entrée
UNION ALL SELECT Produit,-Quantité FROM Sortie
) AS Liste
GROUP BY Produit

Bon courage

Patrice

--

"aitoz" a écrit dans le message de
news:uwCosW$
Non, en fait, UNION affiche a la suite deux requetes !
Ca ne conviens pas !
Il faut que je fasse un select imbriqué a un niveau encore supplémentaire


!
Je touche au but. Dès que j'ai trouvé je mets la réponse.
Si quelqu'un a une autre idée ? ou meme la réponse je serais ravi.

Merci et bonne soirée




Avatar
aitoz
Mince je touche au but !
Il faut vraiment que je trouve.
Comment faire par exemple pour afficher en bout de ligne la somme des qtés
expédiées ???

Prenons encore un exemple plus simple :

CODE_ARTICLE, DESIGNATION, PRIX1, SOMME QTE EXP
CODE_ARTICLE, DESIGNATION, PRIX2, SOMME QTE EXP
CODE_ARTICLE, DESIGNATION, PRIX3, SOMME QTE EXP
CODE_ARTICLE, DESIGNATION, PRIX4, SOMME QTE EXP

Et la somme qté expédiée serait tjs la meme ?

Je suis sur que je peux trouver mais je n'y arrive pas. Comment faire ?
Parce que une requete imbriquée n'est pas vraiement adéquate !

Bon, si quelqu'un a une idée ?? je suis preneur avec plaisir
Avatar
aitoz
Voila, c'est exactement ca l'exemple !
Comment faire en sorte que le code article, la désignation et le prix soit
une liste non regroupé et qu'au bout de chaque ligne j'affiche la somme des
quantités expédiées sur l'article ?
1 2