Algèbre relationnel

Résolu
MEFTAH Messages postés 18 Statut Membre -  
flokocha Messages postés 1519 Statut Membre -
Bonjour
soit :
Les_Entrees ( Code_Article , Quantite )
1 20
2 11
4 5
Les_Sorties ( Code_Article , Quantite )
1 10
2 15
3 2

Je voudrai une requette SQL qui permet d'obtenir un résultat qui resemble à ceci :

Code Article Qt_Entrée Qt_Sortie
1 20 10
2 11 15
3 0 2
4 5 0

Comment faire SVP et Merci d'avance.

2 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    Bonjour,

    Avec une jointure .....
    Un truc du genre :

     SELECT E.Code_Article, E.Quantite as Qte_entree, S.Quantite as Qte_sortie  
    FROM Qt_Entrée E
    LEFT JOIN Qt_Sortie  S  ON S.Code_Article = E.Code_Article
    
    


    0
  2. flokocha Messages postés 1519 Statut Membre 281
     
    Salut,

    Une jointure utilisant un LEFT JOIN ne pourrait pas produire la ligne numéro 3 de son résultat donné en exemple.

    Étant donné qu'on veut retourner les résultats des deux tables, indépendamment du fait qu'ils soient présents dans l'une ou dans l'autre ce ces tables, il faut utiliser un FULL OUTER JOIN.

    Ce qui donnerait donc (avec l'utilisation de la fonction IFNULL() pour afficher 0 au lieu de null dans le cas où une entrée n'existe pas dans une des deux tables) :

    SELECT Code_Article, IFNULL(E.Quantite, 0) as Qte_entree, IFNULL(S.Quantite, 0) as Qte_sortie
    FROM Qt_Entrée E
    FULL OUTER JOIN Qt_Sortie S USING(Code_Article)
    
    0
    1. MEFTAH Messages postés 18 Statut Membre
       
      Merci de votre patience
      Pouvez vous m'expliquer brièvement le principe de FULL OUTER JOIN
      Et encor une fois MERCI.
      0
    2. MEFTAH Messages postés 18 Statut Membre
       
      #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN Sorties2 S USING(Code_Article) LIMIT 0, 30' at line 3

      Voici l'erreur
      FULL OUTER JOIN est elle supportée par MySQL
      0
    3. MEFTAH Messages postés 18 Statut Membre
       
      En plus j'ai besoin d'un GROUP BY pour les code_article dans le cas ou j'ai plusieurs entrées ou plusieurs sorties
      0
    4. MEFTAH Messages postés 18 Statut Membre
       
      En effet j'ai tester avec MySQL
      Il reconnai LEFT OUTER JOIN et RIGHT OUTER JOIN
      mais pas FULL OUTER JOIN
      Des Suggéssion SVP ?
      0
    5. flokocha Messages postés 1519 Statut Membre 281
       
      Ok au temps pour moi !

      Dans ce cas il va falloir simuler le mode de fonctionnement de ce FULL OUTER JOIN qu'on ne peut pas utiliser. Le fait qu'il puisse y avoir plusieurs entrées dans une tables pour un même article va aussi changer un peu les choses en nous obligeant à calculer préalablement la somme pour chaque article dans chacune des deux tables.

      Je te propose donc de procéder comme ceci :
      - Calculer la somme des entrées de chaque article > E
      - Calculer la somme des sorties de chaque article > S
      - Récupérer les valeurs pour les articles présents dans E et S
      - Récupérer les valeurs pour les articles présents dans E mais pas dans S
      - Récupérer les valeurs pour les articles présents dans S mais pas dans E
      - Faire l'union de ces 3 requêtes

      Ce qui donne :

      SELECT Code_Article, E.Q AS EQ, S.Q AS SQ
      FROM (SELECT Code_Article, SUM(Quantite) AS Q FROM Les_Entrees GROUP BY 1) AS E
      INNER JOIN (SELECT Code_Article, SUM(Quantite) AS Q FROM Les_Sorties GROUP BY 1) AS S USING(Code_Article)
      UNION
      SELECT Code_Article, E.Q AS EQ, 0 AS SQ
      FROM (SELECT Code_Article, SUM(Quantite) AS Q FROM Les_Entrees GROUP BY 1) AS E
      LEFT JOIN (SELECT Code_Article, SUM(Quantite) AS Q FROM Les_Sorties GROUP BY 1) AS S USING(Code_Article)
      WHERE S.Code_Article IS NULL
      UNION
      SELECT Code_Article, 0 AS EQ, S.Q AS SQ
      FROM (SELECT Code_Article, SUM(Quantite) AS Q FROM Les_Entrees GROUP BY 1) AS E
      RIGHT JOIN (SELECT Code_Article, SUM(Quantite) AS Q FROM Les_Sorties GROUP BY 1) AS S USING(Code_Article)
      WHERE E.Code_Article IS NULL
      ORDER BY Code_Article
      
      0