Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
772 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Problème avec SUM et INNER JOIN

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec SUM et INNER JOIN

n°2302456
noam76
Posté le 26-06-2017 à 07:00:06  profilanswer
 

Bonjour a tous
J'ai 3 tables  
1. table client au nom customer_table
2. table action au nom operation_table
3. table de jointure data_integration_table
 
j'ai mis une page web avec form pour insérer les données dans la table de jointure (data_integration_table).
dans ma table de jointure, j'ai :
- l'ID de la table client
- commentaire
- l'ID de la table action
- la date
- le montant
- le total (qui sert pour SUM)
 
dans ma page web j'ai rajouter 4 boutons, selon le bouton cliqué.
dans ma page PHP, j'utilise switch case pour le bouton cliqué et j'affiche le résultat dans une <table>
 
si je lance la requête sans ajouter SUM, chaque ligne de la table s'affiche.
dès que je rajoute la fonction SUM, juste la 1ère ligne de la table s'affiche et le montant Total de toutes les lignes existante dans ma table.
 
mom code

Code :
  1. switch ($_REQUEST['btn_submit'])
  2. {
  3. case "Button 4": //affiche tous le contenu
  4. $sth = $conn->query("SELECT d.date, d.commentaire, d.amount ,c.first_name, c.last_name, o.operation_name FROM d
  5.  INNER JOIN c ON d.customer_id = c.customer_id
  6.  INNER JOIN o ON d.operation_id = o.operation_id" );
  7. $sth->setFetchMode(PDO::FETCH_BOTH);// Mode par défaut (tableau)
  8.  while($row = $sth->fetch())
  9. {
  10.  echo "</tr>";
  11.  echo "<td>", $row['first_name'], '&nbsp',  $row['last_name'],"</td>";
  12.  echo "<td>", $row['operation_name'], "</td>";
  13.   echo "<td>", $row['commentaire'], "</td>";
  14.   echo "<td>", $row['date'], "</td>";
  15.  echo "<td>", $row['amount'], "</td>";
  16.  echo "</tr>";
  17. }
  18. $sth->closeCursor();
  19. break;
  20. }
  21. echo "</table>";
  22. echo "<table>";
  23.   echo "<tr class='noborder'>
  24.  <td></td>
  25.  <td></td>
  26.  <td></td>
  27.  <th>Total</th>
  28.  <td> afficher la somme Total</td>
  29.  </tr>
  30.      </table>";
  31. $conn = null;


 
Pour afficher la somme total j'ai rajouté avant le mot FORM

Code :
  1. sum(data_integration_table.amount) AS 'TotalAmount'


et dans la 2ème table pour afficher la somme total

Code :
  1. <td> $row['TotalAmount'] </td>


 
après le changement cela vas me donner

Code :
  1. switch ($_REQUEST['btn_submit'])
  2. {
  3. case "Button 4": //affiche tous le contenu
  4. $sth = $conn->query("SELECT d.date, d.commentaire, d.amount ,c.first_name, c.last_name, o.operation_name FROM d
  5.  INNER JOIN c ON d.customer_id = c.customer_id
  6.  INNER JOIN o ON d.operation_id = o.operation_id" );
  7. $sth->setFetchMode(PDO::FETCH_BOTH);// Mode par défaut (tableau)
  8.  while($row = $sth->fetch())
  9. {
  10.  echo "</tr>";
  11.  echo "<td>", $row['first_name'], '&nbsp',  $row['last_name'],"</td>";
  12.  echo "<td>", $row['operation_name'], "</td>";
  13.   echo "<td>", $row['commentaire'], "</td>";
  14.   echo "<td>", $row['date'], "</td>";
  15.  echo "<td>", $row['amount'], "</td>";
  16.  echo "</tr>";
  17. }
  18. $sth->closeCursor();
  19. break;
  20. }
  21. echo "</table>";
  22. echo "<table>";
  23.   echo "<tr class='noborder'>
  24.  <td></td>
  25.  <td></td>
  26.  <td></td>
  27.  <th>Total</th>
  28.  <td>", $row['TotalAmount'], "</td>
  29.  </tr>
  30.      </table>";
  31. $conn = null;


 
la juste la 1ère ligne de ma table s'affiche avec le juste Total.
Comment faire pour que toutes les lignes s'affichent bien avec le Total ?

mood
Publicité
Posté le 26-06-2017 à 07:00:06  profilanswer
 

n°2302483
rufo
Pas me confondre avec Lycos!
Posté le 26-06-2017 à 17:30:32  profilanswer
 

Si tu mets un SUM() dans ton select (j'imagine, sur le champ "montant" ), il te faut ajouter la clause GROUP BY à la fin de ta requête et d'indiquer comment tu veux sommer (quels critères de regroupement). Je te conseille d'apprendre le SQL, sans ça, tu vas perdre beaucoup de temps :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2302485
noam76
Posté le 26-06-2017 à 18:50:34  profilanswer
 

j'ai décidé de me mettre au sql, pour cela j'ai suivis des tuto sur https://openclassrooms.com/
par la suite j'ai réussis a faire inner join entre 3 tables, ça ma pris du temps, j'ai réussis.
 
comme je ne suis pas programmeurs de métiers , par petit pas j'apprend, je m'informe, je demande de l'aide après avoir fait plusieurs recherche sur le net.
 
je ne savais qu'il y a besoin de GROUP BY , c'est pour faire le trie , c'est bien ça?
 
que veut-tu dire par comment tu veux sommer (quels critères de regroupement) ?
un exemple sera le bien venu :)

n°2302514
rufo
Pas me confondre avec Lycos!
Posté le 27-06-2017 à 13:52:43  profilanswer
 

Pas du tout, le GROUP By, c'est pour faire des regroupements pour les agrégations mises dans le SELECT (ex : COUNT(), SUM(), MIN(), MAX()...). Pour le tri, c'est ORDER BY.
 
Pour les regroupements, il faut indiquer comme les faire. Ex : Voici une liste d'enregistrements
Marque      Modèle     Prix
Renault      Clio          15000 €
Renault      Clio          13500 €
Renault      Modus      9000 €
Citroën      C3           12000 €
Citroën      C4           17000 €
Citroën      C4           16000 €
 
Si je veux faire une requête pour faire un SUM() sur le prix, il faut bien indiquer comment je veux sommer, comment je veux faire les regroupements des lignes : sur la colonne Marque, sur la colonne Modèle, ou sur le couple Marque/Modèle. La clause GROUP BY sert à ça. Si je fait un GROUP BY Marque, Modèle, en résultat, j'aurai 4 lignes :
Renault, Clio, 28500 €
Renault, Modus, 9000 €
Citroën, C3, 12000 €
Citroën, C4, 33000 €
 
Si je fais un group by Marque, j'aurai que 2 lignes (Renault, Citroën et la somme par marque). Si je fais un group by Modèle, j'aurai 4 lignes (Clio, Modus, C3, C4 et la somme par modèle).


Message édité par rufo le 27-06-2017 à 14:00:17

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2302575
noam76
Posté le 28-06-2017 à 05:46:52  profilanswer
 

j'ai compris a quoi sert le GROUP BY, merci pour l'explication :)
 
Si je fais un GROUP BY Marque, j'ai envie de rajouter après chaque ligne la quantité existante, je dois rajouter quel fonction?
 
Renault, Clio, 28500 €, 2
Renault, Modus, 9000 €, 1
Citroën, C3, 12000 €, 2
Citroën, C4, 33000 €, 2

n°2302585
rufo
Pas me confondre avec Lycos!
Posté le 28-06-2017 à 10:31:02  profilanswer
 

En plus du SUM(), tu rajoutes un COUNT() sur l'ID des voitures qui sont liées à un modèle (le modèle étant lié à la marque). Quand je parle de "lié", cela implique un lien via une clé étrangère (vers une clé primaire).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2302606
noam76
Posté le 28-06-2017 à 14:06:26  profilanswer
 

Merci :)

n°2302747
noam76
Posté le 30-06-2017 à 16:41:37  profilanswer
 

Bonjour,
J'ai rédigé mon query :)
je prends comme exemple une table de facture d'achat :
ID du client, ID numéros de catalogue, date, prix, quantité, total
 
j'ai fait COUNT(ID numéros de catalogue), SUM(prix),
WHERE (ID client)
GROUP BY sur 2 cologne,(ID du client,ID numéros de catalogue).
Je reçois bien le résultat:
 
ID du client, ID numéros de catalogue, date, prix, quantité, total
Yanick                  colle                             3€       2        6€
Yanick                gomme                           2€      20      40€
Yanick                 trousse                          10€      5        50€
 
si j'ai envie de rajouter une ligne avec le Total comment faire j'ai pas réussi a trouver?
du genre SUM du SUM(total)
 
ID du client, ID numéros de catalogue, date, prix, quantité, total
Yanick                  colle                             3€       2        6€
Yanick                gomme                           2€      20      40€
Yanick                 trousse                          10€      5        50€
_____________________________________________________
                                                                   Total      96€


Message édité par noam76 le 30-06-2017 à 16:43:18
n°2302756
rufo
Pas me confondre avec Lycos!
Posté le 30-06-2017 à 21:56:12  profilanswer
 

Faudra faire une autre requête pour avoir le total. Pas possible de faire en une seule. Ou alors, passer par les procédures stockées.
 
Si, un mix de SQL + PHP. SQL te sort le 1er résultat et pour le total, tu le fait via PHP en passant par une variable qui à la lecture de chaque enregistrement (ie chaque ligne), récupère le sous-total et l'ajoute au total des lignes précédentes.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2302767
noam76
Posté le 01-07-2017 à 20:32:36  profilanswer
 

C'est ce que j'ai fais une 2ème requête.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Problème avec SUM et INNER JOIN

 

Sujets relatifs
Problème de logique (boucle infinie)Problème de lecture de son
Problème "UPDATE" SQLProblème syntaxe VBA
Problème "end" attendu[résolu]problème comparaison Php/MySql
Problème de paramètres Java en SQLJ (JDBC)Problème de parsing JSON
Problème de code HTML/CSS + Hébergement chez soi[C] Problème de compilation entre emcc et OpenSSL (Résolu)
Plus de sujets relatifs à : Problème avec SUM et INNER JOIN



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR