Problème avec SUM et INNER JOIN

Problème avec SUM et INNER JOIN - SQL/NoSQL - Programmation

Marsh Posté le 26-06-2017 à 07:00:06    

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 ?

Reply

Marsh Posté le 26-06-2017 à 07:00:06   

Reply

Marsh Posté le 26-06-2017 à 17:30:32    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 26-06-2017 à 18:50:34    

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 :)

Reply

Marsh Posté le 27-06-2017 à 13:52:43    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-06-2017 à 05:46:52    

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

Reply

Marsh Posté le 28-06-2017 à 10:31:02    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-06-2017 à 14:06:26    

Merci :)

Reply

Marsh Posté le 30-06-2017 à 16:41:37    

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
Reply

Marsh Posté le 30-06-2017 à 21:56:12    

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 Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-07-2017 à 20:32:36    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed