Rechercher : dans
Par :

Problème de jointure / group by Mysql

Dernière réponse le 28 déc 2007 à 19:26:08 mysql_, le 4 oct 2007 à 16:22:51 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Problème de jointure / group by Mysql » dans :
Envoyer de gros fichiers (pièces jointes) par mail VoirLes systèmes de messagerie bloquent généralement les pièces jointes volumineuses, alors comment faire parvenir un fichier lourd (de plusieurs Mo) à son destinataire ? La solution consiste à utiliser un service d'hébergement temporaire de fichiers...
Réinitialiser le mot de passe root de MySQL VoirQue ce soit lors de la première installation ou après la perte du mot de passe principal de MySQL, il est nécessaire de pouvoir modifier le mot de passe administrateur (root) de MySQL. Vous avez perdu le mot de passe root de MySQL ? Pour pouvoir...
SQL - Tri VoirTri des résultats Il est possible en SQL d'organiser les résultats grâce à la clause ORDER BY. La clause ORDER BY est suivie des mots clés ASC ou DESC, qui précisent respectivement si le tri se fait de manière croissante (par défaut) ou...
Importer et exporter des données sous MySQL VoirImportation et exportation Les Système de Gestion de Bases de Données tels que MySQL permettent de manipuler facilement et avec beaucoup de souplesse un très important volume de données. Toutefois, aussi robuste soit MySQL, il peut être intéressant...
MySQL - Installation sous Windows VoirPrésentation de MySQL MySQL est un Système de Gestion de Bases de Données (SGBD) fonctionnant sous Linux et Windows. Depuis la version 3.23.19, MySQL est sous Licence GPL (aussi bien sous Linux que Windows), ce qui signifie qu'il peut être utilisé...

1

mysql_, le 4 oct 2007 à 16:37:36

Up!

Répondre à mysql_

2

spidag, le 4 oct 2007 à 16:53:28

Si tu nous donnais un schéma meme textuel de ta bdd commenté ca nous arrangerai :)

Répondre à spidag

3

mysql_, le 4 oct 2007 à 17:00:40

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

Répondre à mysql_

4

mysql_, le 4 oct 2007 à 17:24:10

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 !

Répondre à mysql_

5

spidag, le 4 oct 2007 à 17:30:30

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;

Répondre à spidag

6

mysql_, le 4 oct 2007 à 18:00:02

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

Répondre à mysql_

7

mysql_, le 4 oct 2007 à 18:03:15

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;

Répondre à mysql_

8

mysql_, le 4 oct 2007 à 18:22:41

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 !

Répondre à mysql_

9

mysql_, le 4 oct 2007 à 18:38:32

Up !

Répondre à mysql_

10

spidag, le 4 oct 2007 à 20:55:58

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.

Répondre à spidag

11

my_sql_, le 4 oct 2007 à 21:05:53

Bonsoir,
sa marche avec le distinct, pkoi toi tu le ferais en deux requettes ?

Répondre à my_sql_

12

blink, le 28 déc 2007 à 10:38:18

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)

Répondre à blink

13

 nafa Acher, le 28 déc 2007 à 19:26:08

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';

Répondre à nafa Acher