IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Requête de somme sur 3 tables [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Requête de somme sur 3 tables
    Bonjour,
    actuellement en stage d'informatique de deuxième année de DUT, j'ai une requête qui me pose problème. Je ne pense pas que le problème soit compliqué mais je tourne en rond et je viens donc vous demander un peu d'aide !

    Je vous détaille le problème :
    J'ai trois tables T_Piece(NomPièce, StockMiniPiece), T_PieceEntree(NomPiece, DateEntree, QuantiteAchat, PrixAchat), et T_PieceSortie(NomPiece, DateSortie, QuantiteSortie)

    J'ai un formulaire qui me permet de rentrer les pièces ainsi que leurs entrées et sorties, avec de la mise en forme conditionnelle qui met en avant les pièces à commander tout ça...

    Le problème est que j'ai besoin de créer un état qui me calcule le stock par pièce, et donc qui sélectionne seulement les pièces dont ce stock est inferieur à StockMinimum, pour pouvoir imprimer toutes les pièces à commander.

    Le dernier code que j'ai essayé, et qui me semble être le meilleur malgré son non fonctionnement est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Piece.NomPiece, T_Piece.StockMiniPiece, Sum([QuantiteAchat])-Sum([QuantiteSortie]) AS Stock
    FROM (T_Piece INNER JOIN T_PieceEntree ON T_Piece.NomPiece = T_PieceEntree.NomPiece) INNER JOIN T_PieceSortie ON T_Piece.NomPiece = T_PieceSortie.NomPiece
    GROUP BY T_Piece.NomPiece, T_Piece.StockMiniPiece
    HAVING (((Sum([QuantiteAchat])-Sum([QuantiteSortie]))<=[StockMiniPiece]));
    Le problème est que, si j'ai plusieurs lignes dans ma table, il va les additionner une fois de trop
    Un exemple pour me faire mieux comprendre :
    Si PieceNum1 a 20 entrées à la date 1, et 10 entrées à la date 2
    Si elle a également 5 sorties à la date 3,
    je me retrouve avec un stock de... 20 car l'ordinateur a fait (20 + 10 - 5 - 5) = 20, car la ligne des sorties a été comptée autant de fois qu'il y a d'entrées, c'est à dire 2 fois ici...
    Cela fonctionne donc pour 1 entrée et 1 sortie, mais je ne vous dis pas quand le nombre d'entrées et de sorties commence à être important...

    Enfin je pense que ma requête est, de toute façon fausse, donc je ne sais pas si c'est très utile que je la détaille plus, mais tout ça pour vous dire que j'ai cherché et que je n'y arrive pas !

    Je vous demande donc de l'aide car je ne sais pas quelle requête utiliser !

    Merci d'avance !

    Kiiwy

  2. #2
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Peut-être faut-il diviser le problème en plusieurs étapes :
    1- Calculer le nombre de pièce entrée
    2- Calculer le nombre de pièce sortie
    3- Comparer le stock restant au nombre mini permis.

    Pour cela j'ai d'abord modifié un peu la structure de tes tables. J'ai rajouté une clé primaire numérique et une clé étrangère numérique sur les tables T_PieceEntree et T_PieceSortie. Ainsi j'ai
    - T_Piece(IDPiece, NomPiece, SotckMiniPiece)
    - T_PieceEntree(IDPieceEntree, NomPiece_ID_E, DateEntree, QuantiteAchat, PrixAchat)
    - T_PieceSortie(IDSortie, NomPiece_ID_S, DateSortie, QuantiteSortie)

    T_Piece est liée à T_PieceEntree par le champ IDPiece/NomPiece_ID_E et à T_PieceSortie par le champ IDPiece/NomPiece_ID_S. Je ne sais pas si c'était nécessaire mais personnellement j'y vois plus clair.

    Ensuite j'ai créé une requête calculant le nombre de pièces entrées (R_T_PieceEntree avec Sum(T_PieceEntree.QuantiteAchat) As Achat), une requête sur les pièces sorties (R_T_PieceSortie avec Sum(T_PieceSortie.QuantiteSortie) As Sortie), toutes 2 groupées sur le nom de la pièce.

    R_T_PieceEntree
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCTROW T_PieceEntree.NomPiece_ID_E, Sum(T_PieceEntree.QuantiteAchat) AS Achat
    FROM T_PieceEntree
    GROUP BY T_PieceEntree.NomPiece_ID_E;
    R_T_PieceSortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCTROW T_PieceSortie.NomPiece_ID_S, Sum(T_PieceSortie.QuantiteSortie) AS Sortie
    FROM T_PieceSortie
    GROUP BY T_PieceSortie.NomPiece_ID_S;
    Et enfin la requête qui vérifie la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_Piece.NomPiece, T_Piece.StockMiniPiece, [R_T_PieceEntree].[Achat]-[R_T_PieceSortie].[Sortie] AS Stock
    FROM (T_Piece INNER JOIN R_T_PieceEntree ON T_Piece.IDPiece = R_T_PieceEntree.NomPiece_ID_E) INNER JOIN R_T_PieceSortie ON T_Piece.IDPiece = R_T_PieceSortie.NomPiece_ID_S
    WHERE (((T_Piece.StockMiniPiece)>[R_T_PieceEntree].[Achat]-[R_T_PieceSortie].[Sortie]))
    GROUP BY T_Piece.NomPiece, T_Piece.StockMiniPiece, [R_T_PieceEntree].[Achat]-[R_T_PieceSortie].[Sortie];
    Le résultat affiche le nom de la pièce, le stock mini de la pièce et le stock actuel.

    A bientôt
    Laurent

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci Laurent pour votre réponse rapide et claire !
    Elle est beaucoup plus détaillée que ce que j'attendais et je suis ravi !

    Il est vrai que le plus simple est de détailler le problème en plusieurs étapes...
    Je mets ce système en place dès demain et je vous fais une réponse pour préciser l'avancement de mon problème !

    Je vous remercie encore !

    Kiiwy

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 722
    Points : 57 381
    Points
    57 381
    Billets dans le blog
    42
    Par défaut
    bonjour,

    avec deux étapes, on peut aussi faire l'union des entrées et des sorties (avec un signe - pour les quantités sorties).

    Requête RMvt,
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NomPiece, DateEntree as DateMouvement, QuantiteAchat as QuantiteMouvement FROM T_PieceEntree
    UNION ALL
    SELECT NomPiece, DateSortie, -(QuantiteSortie) FROM T_PieceSortie;
    puis :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_Piece.NomPiece, T_Piece.StockMiniPiece, nz(Sum(RMvt.QuantiteMouvement),0) AS SommeDeQuantiteMouvement
    FROM T_Piece  LEFT JOIN  RMvt ON RMvt.NomPiece = T_Piece.NomPiece
    GROUP BY T_Piece.NomPiece, T_Piece.StockMiniPiece;

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci Fabien pour votre réponse aussi très rapide et bien détaillée !

    Je vais garder la solution de Fabien que je trouve peut-être plus subtile avec la quantité négative ! Je n'y aurais jamais pensé
    Je garde toutefois la solution de Laurent sous la main dans le cas ou je déciderais de rajouter des identifiants numériques ! Et surtout si j'ai besoin de réutiliser les deux requêtes intermédiaires, R_T_PieceEntree et R_T_PieceSortie.

    Merci en tout cas à vous deux, je passe le sujet à résolu !

    Bonne journée

    Kiiwy

  6. #6
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Ah oui effectivement la solution de Fabien est beaucoup plus élégante ! Bravo et merci.

    Bonne journée
    Laurent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WB 16] requête somme sur deux tables
    Par PaulNero dans le forum WebDev
    Réponses: 5
    Dernier message: 14/06/2011, 12h22
  2. Réponses: 2
    Dernier message: 17/06/2009, 10h12
  3. Requête très longue sur une table très simple
    Par kragenskul dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/06/2009, 14h28
  4. Requête SQL : Jointure sur 3 tables - Bd Access 1997 & Delphi 7
    Par Didier100 dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/12/2007, 09h57
  5. Somme sur une table
    Par Logp524 dans le forum WinDev
    Réponses: 3
    Dernier message: 02/08/2007, 08h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo