Problème de jointure / group by Mysql

mysql_ -  
 nafa Acher -
Bonjour,
j'aimerais afficher la liste des factures, avec le montant total du (sachant que les factures peuvent etre enregistrée sur plusieurs ligne, donc il faut un sum(debit) pour le total), le montant total des encaissement( sum(paiement), et le libellé et la date de la facture, voici ma requete qui ne fonctionne pas, enfin si ca m'affiche tout saudf que le total est erroné.

SELECT factures.date,factures.libelle,factures.ref, sum(factures.debit) as montant,fournisseurs.nom, sum(paiement_factures.montant)
FROM
factures inner join fournisseurs
on fournisseurs.id=factures.id_fournisseur
left join paiement_factures
on factures.ref=paiement_factures.ref
group by factures.ref;

a l'aide !
Configuration: Windows XP
Internet Explorer 6.0

13 réponses

  1. spidag
     
    SELECT factures.date,factures.libelle,factures.ref, sum(factures.debit) as montant,fournisseurs.nom, sum(paiement_factures.montant)
    FROM factures inner join fournisseurs on fournisseurs.id=factures.id_fournisseur
    right join paiement_factures on factures.ref=paiement_factures.ref
    group by factures.id;

    Mais je penses qu'il faudrait repenser ta bdd,
    une table ligne_facture serait plus adapté.

    factures :
    id
    id_fournisseur
    date

    ligne_facture :
    id
    libelle
    debit
    ref_facture

    Ce qui donnerai :
    SELECT factures.date,factures.libelle,factures.ref, sum(ligne_factures.debit) as montant,fournisseurs.nom, sum(paiement_factures.montant)
    FROM factures inner join fournisseurs on fournisseurs.id=factures.id_fournisseur
    inner join ligne_factures on ligne_factures.ref_facture=facture.id
    left join paiement_factures on factures.ref=paiement_factures.ref
    group by factures.id;
    1
  2. spidag
     
    Si tu nous donnais un schéma meme textuel de ta bdd commenté ca nous arrangerai :)
    0
  3. mysql_
     
    Table factures :
    id
    id_fournisseur
    date
    libelle
    debit
    ref

    Table paiement_factures:
    id
    ref
    date
    montant

    Table fournisseur
    id
    nom

    Une facture = plusieurs enregistrement dans la table factures, avec le meme "ref"
    Une facture peut etre payée en plusieurs fois, donc il peut y avoir plusieurs lignes dans la table paiement_factures, avec le meme "ref", celui de la facture concernée
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. mysql_
     
    le probleme, a mon avis, vient du fait que j'ai deux fois sum() et un seul group by, donc faut trouver une solution pour mettre deux group by ??? je ne sait pas :-(

    up !
    0
  6. mysql_
     
    merci SPIDAG ! !
    ca marche, et j'ai compris ma faute ;)

    SELECT factures.date, factures.libelle, factures.ref, sum( ligne_facture.debit ) AS montant, fournisseurs.nom, sum( paiement_factures.montant )
    FROM factures
    INNER JOIN fournisseurs ON fournisseurs.id = factures.id_fournisseur
    INNER JOIN ligne_facture ON ligne_facture.ref_facture = factures.ref
    LEFT JOIN paiement_factures ON factures.ref = paiement_factures.ref
    GROUP BY factures.ref
    LIMIT 0 , 30;

    merci une deuxème fois
    0
  7. mysql_ Messages postés 3 Statut Membre
     
    SELECT factures.date, factures.libelle, factures.ref, sum( ligne_facture.debit ) AS montant, fournisseurs.nom, sum( paiement_factures.montant )
    FROM factures
    INNER JOIN fournisseurs ON fournisseurs.id = factures.id_fournisseur
    INNER JOIN ligne_facture ON ligne_facture.ref_facture = factures.ref
    LEFT JOIN paiement_factures ON factures.ref = paiement_factures.ref
    GROUP BY factures.ref
    LIMIT 0 , 30;
    0
  8. mysql_ Messages postés 3 Statut Membre
     
    reeeeeee
    la requette donne le meme resultat que ma première requete postée dans le forum, elle donne un résultat erronné.
    exemple:

    une facture quii as deux ligne, et réglée en une seule fois, le resultat du sum(paiement_facture.montant) est deux fois la somme payée.

    :s :s

    marche pas !
    0
  9. mysql_ Messages postés 3 Statut Membre
     
    up !
    0
  10. spidag
     
    ce que tu demandes est peut etre impossible en une requete.
    A moins de faire un distinct paiement_facture.id
    dans le select
    la tu verrais si ca crée un doublon.
    Mais perso je ferais cela en 2 requetes.
    0
  11. my_sql_
     
    bonsoir,
    sa marche avec le distinct, pkoi toi tu le ferais en deux requettes ?
    0
  12. blink
     
    ce qui donne quoi au final ?

    J'ai un problème similaire avec des doublons qui me compte 2 fois trop de ligne (je fais un count au lieu de sum dans mon cas)
    0
  13. nafa Acher
     
    Il me semble que tu oeux résoudre tous tes probèmes avec une requête du genre :

    Deux tables : $tb_commandes='bt_affaire';
    $tb_delegues='gt_groupe_utilisateurs';

    Ce qui donne :

    $cde1 = 'SELECT '.$tbl_delegues.'.id_utilisateur , '.$tbl_delegues.'.nom , '.$tbl_delegues.'.prenom , '.$tbl_delegues.'.telephone , '.$tbl_commandes.'.Receptionnaire, sum('.$tbl_commandes.'.Montant_HT) TotalHT, sum('.$tbl_commandes.'.Montant_TTC) ';
    $cde1.=' FROM '.$tbl_commandes.' LEFT JOIN '.$tbl_delegues.'
    ON '.$tbl_commandes.'.Receptionnaire = '.$tbl_delegues.'.id_utilisateur ORDER BY TotalHT
    GROUP BY '.$tbl_commandes.'.Receptionnaire';

    /*
    $cde1.=' UNION ';

    $cde1 .= 'SELECT '.$tbl_delegues.'.id_utilisateur , '.$tbl_delegues.'.nom , '.$tbl_delegues.'.prenom , '.$tbl_delegues.'.telephone , '.$tbl_commandes.'.Receptionnaire, sum('.$tbl_commandes.'.Montant_HT) , sum('.$tbl_commandes.'.Montant_TTC) ';

    $cde1.=' FROM '.$tbl_commandes.' RIGHT JOIN '.$tbl_delegues.' ON '.$tbl_commandes.'.Receptionnaire = '.$tbl_delegues.'.id_utilisateur
    GROUP BY '.$tbl_commandes.'.Receptionnaire';
    0