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

  1. #1
    Futur Membre du Club
    [SQL] Requête avec jointure ne renvoie pas les bons résultats.
    Bonjour,

    J'ai eu beau chercher dans les forums ou sur internet, je n'ai pas trouvé la bonne réponse à mon problème, mais comme je suis débutant en SQL, j'ai dû passer à côté de quelque chose.
    Je suis en firebird 3.x.

    Par une procédure stockée (qui marche maintenant!), j'ai créé des enregistrements dans une table "floraison".
    Afin de vérifier que tous les enregistrements de la table "planting" avaient bien été traités par la procédure, j'ai fait la requête suivante:

    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    select p.n_lot,sum(p.surface) s_plt,sum(p.nb_pied) nbp_plt,sum(f.surface) s_fl,sum(f.nb_pied) nbp_fl from planting p
           join floraison f on f.n_lot = p.n_lot
           group by p.n_lot;


    Les résultats obtenus sont:



    Or, ces résultats sont faux.
    Si je fais des requêtes individuelles sur chaque tables, j'obtiens les bons résultats.

    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    select n_lot,sum(surface) s_plt,sum(nb_pied) nbp_plt   from planting group by n_lot ;




    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    select n_lot,sum(surface) sur_fl,sum(nb_pied) pied_fl   from floraison group by n_lot ;




    Dans les requêtes simples, on obtient bien les mêmes surfaces et mêmes nombre de pieds pour les lots traités, mais dans la requêtes avec jointure, les surfaces et nombre de pieds sont beaucoup plus élevés.

    Une aide serait la bienvenue pour m'expliquer la bonne jointure à faire. Je pense que la somme se fait à chaque fois qu'il y a un enregistrement pour la jointure, mais je ne sais pas comment résoudre ce problème.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Bonjour,

    J'ai supposé que pour un lot il pouvait y avoir zéro à plusieurs floraisons, d'où une jointure OUTER de lot vers floraison, si c'est le contraire, inversez les deux tables

    Voici :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    select L.n_lot
         , sum(L.surface) as Lsurf
         , sum(L.nb_pied) as Lnbpi
         , F.Fsurf
         , F.Fnbpi
    from TLOT L
    left join
         (select n_lot
               , sum(surface) as Fsurf
               , sum(nb_pied) as Fnbpi
          from TFLO
          group by n_lot
         ) as F
       on F.n_lot=L.n_lot
    group by L.n_lot
           , F.Fsurf
           , F.Fnbpi

  3. #3
    Futur Membre du Club
    Bonjour,

    Merci beaucoup, ça fonctionne très bien avec la sous-requête.
    Maintenant, je vais continuer ma PS qui va rajouter une table et je referai (ou j'essayerai) de refaire le même contrôle sur 2 tables.

    Encore merci beaucoup.

###raw>template_hook.ano_emploi###