Problème de calcul avec (SUM) Mysql /PHP
Résolu/Fermé
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
-
Modifié le 26 juil. 2020 à 16:26
Jules_2569 Messages postés 52 Date d'inscription vendredi 13 décembre 2019 Statut Membre Dernière intervention 28 juillet 2020 - 28 juil. 2020 à 22:30
Jules_2569 Messages postés 52 Date d'inscription vendredi 13 décembre 2019 Statut Membre Dernière intervention 28 juillet 2020 - 28 juil. 2020 à 22:30
A voir également:
- Php mysql sum
- Easy php - Télécharger - Divers Web & Internet
- Mysql community server - Télécharger - Bases de données
- Get_magic_quotes_gpc php 8 ✓ - Forum PHP
- Error 2002 (hy000): can't connect to local mysql server through socket '/var/lib/mysql/mysql.sock' (2) ✓ - Forum Linux / Unix
- Mysql gratuit ou payant - Forum MySQL
13 réponses
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
Ambassadeur
1 551
26 juil. 2020 à 16:30
26 juil. 2020 à 16:30
bonjour, as-tu essayé d'ajouter une clause GROUP BY?
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
26 juil. 2020 à 16:38
26 juil. 2020 à 16:38
Bonjour,
oui j'ai fait GROUP BY invoice.id_invoice à la ligne 43
oui j'ai fait GROUP BY invoice.id_invoice à la ligne 43
<script type="text/javascript"> $(document).ready(function(){ $('#tableData').paging({limit:15}); }); </script> <?php //on inclus le fichier de connexion à la bdd require_once "../inc/connexion.php"; //connexion à la bdd $bdd = getDB(); // on récupère PROPREMENT les variables AVANT de les utiliser $query = !empty($_POST["query"]) ? $_POST["query"]: NULL; //var_dump($query); //on prépare la requête SQL $sql = "SELECT SUM(montant) AS prix_ttc, SUM(montant_tva) AS montant_tva, SUM(prix_ht) AS prix_ht, taux_tva, invoice.id_invoice FROM shoppings LEFT JOIN invoice ON (shoppings.id_invoice=invoice.id_invoice) LEFT JOIN paiements ON (shoppings.id_invoice=paiements.id_invoice) WHERE etat = 1"; //début du traitement : if($query){ $search = $query; // var_dump($search); //si il y a une recherche on ajoute le WHERE à la requete : $sql .= " AND etat = 1 AND invoice.id_invoice LIKE '%".$search."%' "; // var_dump($sql); } //concaténation de $sql = " SELECT * FROM customers "; pour afficher les entrées de client en DESC $sql .= " GROUP by invoice.id_invoice DESC " ; //$sql .= " AND type=1 OR (statut_type=1 OR statut_type=2 OR statut_type=3 OR statut_type=4 OR statut_type=5) AND etat = 1 GROUP BY invoice.id_invoice DESC" ; //Execution de la requete try{ $requete = $bdd -> prepare($sql) ; $requete->execute() ; $result = $requete->fetchAll(); // on stocke le resultat dans un array }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); } ?> <html> <head> <meta charset="utf-8"> </head> <body> <?php $output = ''; if(!empty($result)) { $output .= '</br> <div class="box-body table-responsive no-padding" id="tableData"> <table class="table table-striped "> <thead> <tr> <th>ID </th> <th>Total HT</th> <th>Total TVA</th> <th>Total TTC</th> <th>Paiement</th> </tr> </thead> <tbody>'; try { $db = getDB(); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } foreach($result as $row){ // $ttc = number_format ($row['prix_ttc'],2); // $paiements =number_format ($row['montant'],2) ; // $balance = $ttc - $paiements; $output .= ' <tr> <td width="1%"> <a href="../form/invoice.php?id_invoice='. $row['id_invoice'] .' "><button type="button" class="btn btn-block btn-primary btn-xs flat">' . $row['id_invoice'] . '</td> <td width="6%">'. number_format ($row['prix_ht'],2).'</td> <td width="6%">'. number_format ($row['montant_tva'],2).'</td> <td width="6%">'. number_format ($row['prix_ttc'],2).'</td> </tr> '; } echo '</tbody> </table></div>'; } else { echo 'Données non trouvées'; } echo $output; ?> </body> </html>
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
Ambassadeur
1 551
Modifié le 26 juil. 2020 à 16:48
Modifié le 26 juil. 2020 à 16:48
peux-tu donner la liste des champs de chaque table, ou, au minimum, ajouter le nom de la table à chaque champ dans le SELECT?
peux-tu éviter de nous montrer des images, partages plutôt du texte.
teste ta requête après avoir retiré les SUM: tout te semble-t'il logique?
si, pour un même id_invoice, tu as plusieurs enregistrements dans la table shoppings ainsi que dans la table paiements, tu ne peux pas faire les sommes ainsi. cela devrait être clair quand tu exécutes la requête sans SUM.
tu dois faire plutôt ainsi:
peux-tu éviter de nous montrer des images, partages plutôt du texte.
teste ta requête après avoir retiré les SUM: tout te semble-t'il logique?
si, pour un même id_invoice, tu as plusieurs enregistrements dans la table shoppings ainsi que dans la table paiements, tu ne peux pas faire les sommes ainsi. cela devrait être clair quand tu exécutes la requête sans SUM.
tu dois faire plutôt ainsi:
select a.nfacture, a.prixtotal, b.montanttotal from (select invoice.id_invoice as nfacture, sum(prix_ht) as prixtotal from invoice left join shoppings ON shoppings.id_invoice=invoice.id_invoice) as a, (select invoice.id_invoice as nfacture, sum(montant) as montanttotal from invoice left join paiements ON paiements .id_invoice=invoice.id_invoice) as b where a.nfacture=b.nfacture
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
Modifié le 26 juil. 2020 à 17:16
Modifié le 26 juil. 2020 à 17:16
Voici la liste des champs de la table
Table invoice :
id_invoice
id_customer
created
Table shoppings :
id_shoppings
id_invoice
id_items
prix_ht
montant_tva
etat
Table paiements :
id_paiement
id_invoice
montant
method
metodid
date_paiement
J'ai retirer les SUM, quand il y a plusieurs lignes ça m'affiche que le dernier qui insérer
Table invoice :
id_invoice
id_customer
created
Table shoppings :
id_shoppings
id_invoice
id_items
prix_ht
montant_tva
etat
Table paiements :
id_paiement
id_invoice
montant
method
metodid
date_paiement
J'ai retirer les SUM, quand il y a plusieurs lignes ça m'affiche que le dernier qui insérer
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
26 juil. 2020 à 17:22
26 juil. 2020 à 17:22
ça m'affiche une ligne avec l’addition total est ça me dit Undefined index: id_invoice
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
1 551
>
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
26 juil. 2020 à 22:30
26 juil. 2020 à 22:30
as-tu testé ma suggestion en dehors du PHP?
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
26 juil. 2020 à 17:40
26 juil. 2020 à 17:40
J'ai rien compris a votre requête, ça m'embrouille plus qu'autre chose.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
Ambassadeur
1 551
26 juil. 2020 à 22:43
26 juil. 2020 à 22:43
ce sera sans doute plus clair de d'abord tester séparément avec ces deux requêtes, et d'en observer les résultats:
select invoice.id_invoice as nfacture, sum(prix_ht) as prixtotal from invoice left join shoppings ON shoppings.id_invoice=invoice.id_invoice
select invoice.id_invoice as nfacture, sum(montant) as montanttotal from invoice left join paiements ON paiements .id_invoice=invoice.id_invoice
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
Modifié le 27 juil. 2020 à 13:15
Modifié le 27 juil. 2020 à 13:15
Effectivement, c’est plus clair, les requêtes une par une fonctionne, les résultats sont corrects. Comment intégrer les deux ensembles?
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
1 551
27 juil. 2020 à 13:35
27 juil. 2020 à 13:35
comme suggéré en #3.
si tu as sauvé et nommé les deux requetes individuelles, tu peux les utiliser ainsi:
si tu as sauvé et nommé les deux requetes individuelles, tu peux les utiliser ainsi:
select a.nfacture, a.prixtotal, b.montanttotal from requete_un as a, requete_deux as b where a.nfacture=b.nfacture
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
27 juil. 2020 à 13:52
27 juil. 2020 à 13:52
Voici ce que j'ai fait :
J'ai le message ci-dessous :
$sql =" select a.nfacture, a.prixtotal, b.montanttotal from select invoice.id_invoice as nfacture, sum(prix_ht) as prixtotal from invoice left join shoppings ON shoppings.id_invoice=invoice.id_invoice as a, select invoice.id_invoice as nfacture, sum(montant) as montanttotal from invoice left join paiements ON paiements .id_invoice=invoice.id_invoice as b where a.nfacture=b.nfacture ";
J'ai le message ci-dessous :
Erreur ! SQLSTATE[42000]: Syntax error or access violation: 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 'select invoice.id_invoice as nfacture, sum(prix_ht) as prixtotal from invoice le' at line 3 Données non trouvées
jordane45
Messages postés
38289
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 novembre 2024
4 703
27 juil. 2020 à 14:42
27 juil. 2020 à 14:42
Bonjour,
Tu dois placer tes sous-requêtes dans des parenthèses
Tu dois placer tes sous-requêtes dans des parenthèses
SELECT a.*,b.* FROM ( select .. from table1....) as a ,( select .. from table2....) as b
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
Modifié le 27 juil. 2020 à 19:37
Modifié le 27 juil. 2020 à 19:37
J'ai ajouté les parenthèse, j'ai une seule ligne avec l’addition du prixtotal et pareil pour le montanttotal .
j'ai fait GROUP BY nfacture. c'est pareil, il n'y a pas de message.
j'ai fait GROUP BY nfacture. c'est pareil, il n'y a pas de message.
$sql =" select a.nfacture, a.prixtotal, b.montanttotal from (select invoice.id_invoice as nfacture, sum(prix_ht) as prixtotal from invoice left join shoppings ON shoppings.id_invoice=invoice.id_invoice) as a, (select invoice.id_invoice as nfacture, sum(montant) as montanttotal from invoice left join paiements ON paiements .id_invoice=invoice.id_invoice ) as b where a.nfacture=b.nfacture ";²
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
1 551
27 juil. 2020 à 20:32
27 juil. 2020 à 20:32
c'est préférable de d'abord tester les requêtes hors PHP.
quel message attends-tu?
tu obtiens une seule ligne, est-elle correcte? que contient-elle? qu'attends-tu d'autre?
quel message attends-tu?
tu obtiens une seule ligne, est-elle correcte? que contient-elle? qu'attends-tu d'autre?
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
Modifié le 27 juil. 2020 à 21:03
Modifié le 27 juil. 2020 à 21:03
Quand j'ai dis il n'y a pas de message, je voulais dire pas de message d'erreur. Je n'attends aucun message.
la ligne que j'obtiens et l'addition du prix de toutes les factures et de tout les paiements. ce que j'attends c'est chaque facture (chaque ligne du tableau) a ses paiements, quand il en a pas ça met zéro.
en gros pour chaque ligne (numéro de facture) du tableau je voudrais avoir le total ht, le montant de la tva, le total ttc de la table shoppings, et le paiement déjà reçu de la table paiements, pour pouvoir voir d'un coup d'oeil, le prix de la facture et le reste a payer a coté.
après je ferais une soustraction du montant de la facture moins le paiements déjà reçu pour voir le solde restant a payer pour chaque facture.
la ligne que j'obtiens et l'addition du prix de toutes les factures et de tout les paiements. ce que j'attends c'est chaque facture (chaque ligne du tableau) a ses paiements, quand il en a pas ça met zéro.
en gros pour chaque ligne (numéro de facture) du tableau je voudrais avoir le total ht, le montant de la tva, le total ttc de la table shoppings, et le paiement déjà reçu de la table paiements, pour pouvoir voir d'un coup d'oeil, le prix de la facture et le reste a payer a coté.
après je ferais une soustraction du montant de la facture moins le paiements déjà reçu pour voir le solde restant a payer pour chaque facture.
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
1 551
27 juil. 2020 à 22:38
27 juil. 2020 à 22:38
en #12, tu indiquais que les requêtes une par une donnaient le résultat attendu, donc une ligne par facture. c'est bien cela?
la requête combinée, testée en dehors de PHP, donne, quant à elle, une seule ligne?
la requête combinée, testée en dehors de PHP, donne, quant à elle, une seule ligne?
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
Modifié le 27 juil. 2020 à 23:20
Modifié le 27 juil. 2020 à 23:20
je l'ai fait dans phpmyadmin, j'ai le même résultat, une seule ligne. Oui quand je les teste une par une ça me donne une ligne par facture.
mes factures vont de 182 à 190, ça me fait une ligne avec l'id de la facture 182 la 1ère et a coté le total ht la dernière case le total des paiements.
ça vient peut-être de la clause where? ou il manque un condition.
mes factures vont de 182 à 190, ça me fait une ligne avec l'id de la facture 182 la 1ère et a coté le total ht la dernière case le total des paiements.
ça vient peut-être de la clause where? ou il manque un condition.
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
1 551
Modifié le 28 juil. 2020 à 09:51
Modifié le 28 juil. 2020 à 09:51
ou c'est la seule facture qui est présente dans les deux sous-requêtes?
les totaux sont bien corrects pour la facture 182?
si tu as trop peu de résultats, il y aurait plutôt trop de conditions dans le WHERE.
peux-tu partager le texte SQL des trois requêtes, telles que tu fais dans phpmyadmin?
les totaux sont bien corrects pour la facture 182?
si tu as trop peu de résultats, il y aurait plutôt trop de conditions dans le WHERE.
peux-tu partager le texte SQL des trois requêtes, telles que tu fais dans phpmyadmin?
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
Modifié le 28 juil. 2020 à 12:30
Modifié le 28 juil. 2020 à 12:30
Non ce n'est pas la seule facture de présente. Par contre il y a des factures ou il n'y a pas encore d'articles (c'est a dire que la ligne n'existe que dans la table invoice) et des factures ou il n'y a pas de paiements reçu. je veux quand même qu'il me les affiches.
Dans les exemples ci-dessous, pour certaines lignes du tableau, le paiements montanttotal peut être supérieur au prix de la facture prixtotal, c'est normal car il manque le montant de la tva qui doit s'ajouter au prixtotal.
Quand je teste les requête une par une les totaux sont corrects.
Même si je retire la clause WHERE, le résultat est le même une seule ligne
Quand je teste la requêtes combinés ça me donne le résultat ci-dessous.:
nfacture prixtotal montantotal
182 1732 1287
Tester une par une
nfacture prixtotal
182 416
183 327
184 189
185 414
186 109
187 208
188 NULL
189 NULL
190 NULL
191 69
Tester une par une
nfacture montanttotal
182 181.8
183 392.4
184 226.8
185 22.8
186 130.8
187 249.6
188 NULL
189 NULL
190 NULL
191 82.8
Dans les exemples ci-dessous, pour certaines lignes du tableau, le paiements montanttotal peut être supérieur au prix de la facture prixtotal, c'est normal car il manque le montant de la tva qui doit s'ajouter au prixtotal.
Quand je teste les requête une par une les totaux sont corrects.
Même si je retire la clause WHERE, le résultat est le même une seule ligne
Quand je teste la requêtes combinés ça me donne le résultat ci-dessous.:
nfacture prixtotal montantotal
182 1732 1287
Tester une par une
SELECT invoice.id_invoice AS nfacture, sum( prix_ht ) AS prixtotal FROM invoice LEFT JOIN shoppings ON ( shoppings.id_invoice = invoice.id_invoice ) GROUP BY nfacture
nfacture prixtotal
182 416
183 327
184 189
185 414
186 109
187 208
188 NULL
189 NULL
190 NULL
191 69
Tester une par une
SELECT invoice.id_invoice AS nfacture, sum( montant ) AS montanttotal FROM invoice LEFT JOIN paiements ON ( invoice.id_invoice = paiements.id_invoice ) GROUP BY nfacture
nfacture montanttotal
182 181.8
183 392.4
184 226.8
185 22.8
186 130.8
187 249.6
188 NULL
189 NULL
190 NULL
191 82.8
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
1 551
28 juil. 2020 à 13:58
28 juil. 2020 à 13:58
peux-tu montrer également la source SQL de la requête combinée, telle que tu la testes en phpmyadmin?
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
1 551
28 juil. 2020 à 14:04
28 juil. 2020 à 14:04
pour avoir 0 au lieu de NULL, tu peux faire:
sum( ifnull(prix_ht,0) )
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
>
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
Modifié le 28 juil. 2020 à 14:34
Modifié le 28 juil. 2020 à 14:34
Ci-dessous la requête combinée avec son résultat plus bas
résultat requête combinée :
nfacture prixtotal montantotal
182 1732 1287
select a.nfacture, a.prixtotal, b.montanttotal from (select invoice.id_invoice as nfacture, sum(prix_ht) as prixtotal from invoice left join shoppings ON shoppings.id_invoice=invoice.id_invoice) as a, (select invoice.id_invoice as nfacture, sum(montant) as montanttotal from invoice left join paiements ON paiements .id_invoice=invoice.id_invoice ) as b where a.nfacture=b.nfacture
résultat requête combinée :
nfacture prixtotal montantotal
182 1732 1287
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
>
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
Modifié le 28 juil. 2020 à 15:35
Modifié le 28 juil. 2020 à 15:35
J'ajoute que si je retire de la requête combinée la clause WHERE ou le GROUP BY, c'est toujours le même résultat.
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
>
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
28 juil. 2020 à 20:06
28 juil. 2020 à 20:06
Voir #25 et #26
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
28 juil. 2020 à 21:11
28 juil. 2020 à 21:11
Ok merci, comme mes dernières réponses était plus haut que ton dernier messages, je pensais qu'il serait peut être pas pris en compte
yg_be
Messages postés
23328
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2024
Ambassadeur
1 551
28 juil. 2020 à 22:17
28 juil. 2020 à 22:17
des suggestions et une demande:
- sois patient, n'imagine pas que nous n'avons rien d'autre à faire
- essaie de nous donner le maximum d'information, de nous montrer le maximum d'éléments factuels, pour compléter tes idées et tes questions
- fais nous confiance, nous essayons de t'aider, même si la réponse ne t'aide pas immédiatement. nous essayons en même temps de t'aider à court terme, et de t'aider à long terme, en te rendant autonome
- respecte-nous
- peux-tu marquer cette discussion comme résolue, et en ouvrir une nouvelle si utile?
- sois patient, n'imagine pas que nous n'avons rien d'autre à faire
- essaie de nous donner le maximum d'information, de nous montrer le maximum d'éléments factuels, pour compléter tes idées et tes questions
- fais nous confiance, nous essayons de t'aider, même si la réponse ne t'aide pas immédiatement. nous essayons en même temps de t'aider à court terme, et de t'aider à long terme, en te rendant autonome
- respecte-nous
- peux-tu marquer cette discussion comme résolue, et en ouvrir une nouvelle si utile?
Jules_2569
Messages postés
52
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
28 juillet 2020
28 juil. 2020 à 22:30
28 juil. 2020 à 22:30
Désolé d'avoir été impatient. J'ai bien compris ce que tu veux dire pour le reste.