Problème de jointure / group by Mysql
mysql_
-
nafa Acher -
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 !
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 !
A voir également:
- Problème de jointure / group by Mysql
- Message bounced by administrator - Forum Mail
- Gd group - Forum Vos droits sur internet
- Photos liked by ne fonctionne plus ✓ - Forum Facebook
- Shoes by iara - Forum Consommation & Internet
- Mysql community download - Télécharger - Bases de données
13 réponses
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;
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;
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 !
up !
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
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
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;
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;
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 !
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 !
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.
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.
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)
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)
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';
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';