Grouper et somme
Résolu
oliviernapoleon
Messages postés
21
Date d'inscription
Statut
Membre
Dernière intervention
-
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour
j'ai besoin d'aide SVP , sa fait une semaine je me retrouve pas malgré plusieurs recherches sur le net , rien m'a aider.
mon besoin c'est tout d'abord :
- selon le formulaire rempli , grouper les éléments du tableau selon la date_appel (nom du mois ), clients, ncontrat, repere.......etc
- ensuite afficher le nom du mois et son total ainsi que le total de l’année (voir image)
image :

voici mon code à corriger :
j'ai besoin d'aide SVP , sa fait une semaine je me retrouve pas malgré plusieurs recherches sur le net , rien m'a aider.
mon besoin c'est tout d'abord :
- selon le formulaire rempli , grouper les éléments du tableau selon la date_appel (nom du mois ), clients, ncontrat, repere.......etc
- ensuite afficher le nom du mois et son total ainsi que le total de l’année (voir image)
image :

voici mon code à corriger :
<div class="container-fluid"> <div class="col-lg-12"> <div class="card"> <div class="card-body"> <h4 class="card-title">Total panne</h4> <form action="charts.php" method="POST"> <div class="modal-body"> <div class="form-row"> <div class="form-group col-md-3"> <label>ANNEE</label> <select name="year" class="form-control"> <option value="">Choisir une année</option> <?php for ($i=date('Y'); $i>=2019; $i--){?> <option value="<?php echo $i; ?>"><?php echo $i; ?></option> <?php } ?> </select> </div> <div class="form-group col-md-6"> <label for="nom_client">CLIENTS</label> <select onChange="getNcontrat(this.value);" name="nom_client" id="client" class="form-control"> <option value="">Selectionnez un client</option> <?php $query = $connexion->query('SELECT * FROM clients'); while ($row = $query->fetch()){ ?> <option value="<?php echo $row['nom_client']; ?>"><?php echo $row['nom_client']; ?></option>; <?php } ?> </select> </div> </div> <div class="form-row"> <div class="form-group col-md-4"> <label for="n_contrat">N°CONTRAT</label> <select name="n_contrat" id="ncontrat-list" class="form-control"> <option value="">Selectionnez N°CONTRAT</option> </select> </div> <div class="form-group col-md-3"> <label for="repere">REPERE</label> <select name="repere" id="repere-list" class="form-control"> <option value="">Choisir un repere</option> </select> </div> </div> </div> <div class="float-right"> <button type="submit" name="afficher_btn" class="btn btn-primary">Afficher</button> <a href="charts.php" type="button" class="btn btn-success">Initialiser</a> </div> </form> </div> </div> <div class="card shadow mb-4"> <div class="card-body"> <div class="table-responsive"> <h4> <div class="form-row"> <div class="form-group col-md-3 text-primary"><?php if(ISSET($_POST['afficher_btn'])){echo $_POST['year'];}?></div> <div class="form-group col-md-2 text-danger"><?php if(ISSET($_POST['afficher_btn'])){echo $_POST['n_contrat'];}?></div> <div class="form-group col-md-6 text-danger"><?php if(ISSET($_POST['afficher_btn'])){echo $_POST['nom_client'];}?></div> <div class="form-group col-md-1 text-danger"><?php if(ISSET($_POST['afficher_btn'])){echo $_POST['repere'];}?></div> </div> </h4> <table class="table table-bordered" width="100%" cellspacing="0"> <thead class="bg-dark font-weight-bold text-white"> <tr align=center> <th width="10%">DATE</th> <th>COMMENTAIRES</th> <th>TECHNICIENS</th> <th width="5%">PANNE</th> </tr> </thead> <tbody> <?php $connexion = mysqli_connect("localhost","root","","adminpanel") or die("Erreur de connexion."); if(ISSET($_POST['afficher_btn'])){ $year = $_POST['year']; $nom_client = $_POST['nom_client']; $n_contrat = $_POST['n_contrat']; $repere = $_POST['repere']; if($year != "" || $nom_client != "" || $n_contrat != "" || $repere != ""){ $sql = "SELECT date_appel, commentaires, nom_technicien, nombre_panne FROM rapports WHERE year(date_appel)='$year' AND nom_client='$nom_client' AND n_contrat='$n_contrat' AND repere='$repere' GROUP BY MONTHNAME(date_appel)"; $query = mysqli_query($connexion, $sql) or die(mysqli_error()); while($row = mysqli_fetch_array($query)){ echo "<tr> <td>".$row['date_appel']."</td> <td>".$row['commentaires']."</td> <td>".$row['nom_technicien']."</td> <td>".$row['nombre_panne']."</td> </tr>"; ?> <tr> <th colspan="3">TOTAL DU MOIS DE<?php echo $row->MONTHNAME(date_appel);?></th> <td><?php echo $row->sum(nombre_panne);?></td> </tr> <?php } ?> <tr> <th colspan="3">TOTAL ANNEE</th> <td><?php echo $row->sum(nombre_panne);?></td> </tr> <?php }else{ ?> <tr> <td colspan=4 align=center>Pas d'enregistrement trouvé !</td> </tr> <?php } } ?> </tbody> </table> </div> </div> </div> </div> </div>
A voir également:
- Grouper et somme
- Formule somme excel colonne - Guide
- Somme si couleur - Guide
- Somme en anglais excel - Guide
- SOMME SI COULEUR ✓ - Forum Excel
- Somme si ens date comprise entre ✓ - Forum Excel
3 réponses
Bonjour,
Déjà.. as tu testé ta requête sql DIRECTEMENT dans ta BDD ( via l'onglet requête (ou sql) de phpmyadmin ??
Car je pense que ton souci vient déjà de là
NB: pour tester, remplacer les variables PHP par de vraies valeurs disponibles dans la bdd bien entendu ...
Et donc... tu fais des group by .. mais tu sembles avoir oublié d'utiliser la fonction SUM ou COUNT ....
C'est donc un souci de sql et non de php ...
Déjà.. as tu testé ta requête sql DIRECTEMENT dans ta BDD ( via l'onglet requête (ou sql) de phpmyadmin ??
Car je pense que ton souci vient déjà de là
SELECT date_appel , commentaires , nom_technicien , nombre_panne FROM rapports WHERE year(date_appel)='$year' AND nom_client='$nom_client' AND n_contrat='$n_contrat' AND repere='$repere' GROUP BY MONTHNAME(date_appel)
NB: pour tester, remplacer les variables PHP par de vraies valeurs disponibles dans la bdd bien entendu ...
Et donc... tu fais des group by .. mais tu sembles avoir oublié d'utiliser la fonction SUM ou COUNT ....
C'est donc un souci de sql et non de php ...
MERCI pour ta réponse, je viens d'essayer et effectivement le code marche dans SQL lorsque je remplace les variables mais mon soucis demeure toujours :
voir image :

je veux que mettre ensemble pas les séparer et aussi stp donne moi le code pour le calcule de l’année?
voir image :

je veux que mettre ensemble pas les séparer et aussi stp donne moi le code pour le calcule de l’année?
<table class="table table-bordered" width="100%" cellspacing="0"> <thead class="bg-dark font-weight-bold text-white"> <tr align=center> <th width="10%">DATE</th> <th>COMMENTAIRES</th> <th>TECHNICIENS</th> <th width="5%">PANNE</th> </tr> </thead> <tbody> <?php $connexion = mysqli_connect("localhost","root","","adminpanel") or die("Erreur de connexion."); if(ISSET($_POST['afficher_btn'])){ $year = $_POST['year']; $nom_client = $_POST['nom_client']; $n_contrat = $_POST['n_contrat']; $repere = $_POST['repere']; if($year != "" || $nom_client != "" || $n_contrat != "" || $repere != ""){ $sql = "SELECT MONTHNAME(date_appel) as MONTHNAME, commentaires, nom_technicien, nombre_panne, SUM(nombre_panne) as TOTAL FROM rapports WHERE year(date_appel)='$year' AND nom_client='$nom_client' AND n_contrat='$n_contrat' AND repere='$repere' GROUP BY MONTHNAME(date_appel), commentaires, nom_technicien, nombre_panne"; $query = mysqli_query($connexion, $sql) or die(mysqli_error()); while($row = mysqli_fetch_array($query)){ echo "<tr> <td>".$row['MONTHNAME']."</td> <td>".$row['commentaires']."</td> <td>".$row['nom_technicien']."</td> <td>".$row['nombre_panne']."</td> </tr>"; ?> <tr> <th colspan="3">Total <?php echo $row['MONTHNAME'];?></th> <td><?php echo $row['TOTAL'];?></td> </tr> <?php } ?> <tr> <th colspan="3">TOTAL ANNEE</th> <td><?php echo $row['TOTALS'];?></td> </tr> <?php }else{ ?> <tr> <td colspan=4 align=center>Pas d'enregistrement touvé !</td> </tr> <?php } } ?> </tbody> </table>
Je doute que la requête SQL te retourne réellement ce que tu espères....
Pourrais tu nous montrer le résultat de la requête lorsque tu la testes dans phpmyadmin ??
A noter que tu ne peux pas avoir à la fois nombre_panne et SUM(nombre_panne) as TOTAL
Il ne faut garder que la somme...
et donc, remplacer
par :
Et pour le grand total .. il te suffit d'initialiser une variable avant ta boucle ..
puis, dans ta boucle, y additionner le total de chaque mois..
PS: Ici on ne donne pas du code tout fait ... mais on veut bien aider à corriger ou à améliorer.
Pourrais tu nous montrer le résultat de la requête lorsque tu la testes dans phpmyadmin ??
A noter que tu ne peux pas avoir à la fois nombre_panne et SUM(nombre_panne) as TOTAL
Il ne faut garder que la somme...
et donc, remplacer
<td>".$row['nombre_panne']."</td>
par :
<td>".$row['TOTAL']."</td>
Et pour le grand total .. il te suffit d'initialiser une variable avant ta boucle ..
puis, dans ta boucle, y additionner le total de chaque mois..
PS: Ici on ne donne pas du code tout fait ... mais on veut bien aider à corriger ou à améliorer.
LORSQUE JE TESTE DANS PHPMYADMIN :

je sais qu'on donne pas les code tout fait mais si je demande c'est parce que je suis perdu la. déjà vous verrez que moi même j'ai codé et je veux qu'on aide en fonction de mon travail.
Mon soucis c'est que je n'arrive pas a grouper les mêmes mois et faire la somme de l’année malgré votre aide.

je sais qu'on donne pas les code tout fait mais si je demande c'est parce que je suis perdu la. déjà vous verrez que moi même j'ai codé et je veux qu'on aide en fonction de mon travail.
Mon soucis c'est que je n'arrive pas a grouper les mêmes mois et faire la somme de l’année malgré votre aide.
Bonjour
je viens de faire ta proposition , il y a toujours deux ligne "november" ou il accumule en un c'est pas comme ça je veux.
je veux comme ça :
TABLEAU
DATE | COMMENTAIRES | NOM | PANNE
2021-09-10 | texte | JOEL | 1
2021-09-11 | texte | MARX | 1
2021-09-23 | texte | JEAN | 1
nfois
Subtotal NOVEMBER = 3
2021-10-10 | texte | JOEL | 1
2021-10-11 | texte | MARX | 1
nfois
Subtotal OCTOBER = 2
Total année = 5
je veux qu'il liste tous les éléments et non grouper
comme ça :
DATE | COMMENTAIRES | NOM | PANNE
2021-09-10 | texte | JOEL | 3
Subtotal NOVEMBER = 3
2021-10-10 | texte | JOEL | 2
Subtotal OCTOBER = 2
Total année = 5
le soucis de calcul c'est régler mais lister non
voici le code améliorer :
affichage :

je viens de faire ta proposition , il y a toujours deux ligne "november" ou il accumule en un c'est pas comme ça je veux.
je veux comme ça :
TABLEAU
DATE | COMMENTAIRES | NOM | PANNE
2021-09-10 | texte | JOEL | 1
2021-09-11 | texte | MARX | 1
2021-09-23 | texte | JEAN | 1
nfois
Subtotal NOVEMBER = 3
2021-10-10 | texte | JOEL | 1
2021-10-11 | texte | MARX | 1
nfois
Subtotal OCTOBER = 2
Total année = 5
je veux qu'il liste tous les éléments et non grouper
comme ça :
DATE | COMMENTAIRES | NOM | PANNE
2021-09-10 | texte | JOEL | 3
Subtotal NOVEMBER = 3
2021-10-10 | texte | JOEL | 2
Subtotal OCTOBER = 2
Total année = 5
le soucis de calcul c'est régler mais lister non
voici le code améliorer :
<?php
$connexion = mysqli_connect("localhost","root","","adminpanel") or die("Erreur de connexion.");
if(ISSET($_POST['afficher_btn'])){
$year = $_POST['year'];
$nom_client = $_POST['nom_client'];
$n_contrat = $_POST['n_contrat'];
$repere = $_POST['repere'];
if($year != "" || $nom_client != "" || $n_contrat != "" || $repere != ""){
$sql = "SELECT MONTHNAME(date_appel) as MONTHNAME, date_appel, commentaires, nom_technicien, nombre_panne,
SUM(nombre_panne) as SUBTOTAL
FROM rapports
WHERE year(date_appel)='$year' AND nom_client='$nom_client' AND n_contrat='$n_contrat' AND repere='$repere'
GROUP BY MONTH(date_appel)
ORDER BY date_appel";
$query = mysqli_query($connexion, $sql) or die(mysqli_error());
while($row = mysqli_fetch_array($query)){
echo '<tr>';
echo '<td>'.$row['date_appel'].'</td>';
echo '<td>'.$row['commentaires'].'</td>';
echo '<td>'.$row['nom_technicien'].'</td>';
echo '<td align=center>'.$row['nombre_panne'].'</td>';
echo '</tr>';
$total += $row['SUBTOTAL'];
?>
<tr class="text-primary" align=center>
<th colspan="3">Total <?php echo $row['MONTHNAME'];?></th>
<td><?php echo $row['SUBTOTAL'];?></td>
</tr>
<?php
}
?>
<tr class="bg-light text-dark font-weight-bold">
<th colspan="3">TOTAL ANNEE</th>
<td align=center><?php echo $total ?></td>
</tr>
<?php
}
}
?>
affichage :

Ah la la la la .....
Déjà.. on n'est pas frères ....
Ensuite.. je t'ai dit qu'une requête SQL ça se teste d'abord DANS PHPMYADMIN ...( et pas via le code php )
Une fois que ta requête te donnera les bonnes infos dans phpmyadmin... là tu pourras la mettre dans ton code php.
Ensuite..
Tu veux faire une somme en groupant par les "mois"
Il faut donc le SUM() .. et comme tu fais un GROUP BY MONTHNAME ... il ne faut garder dans la partie select que le MONTHNAME ..
Alors.. oui.. je pourrais te donner la requête à écrire ... mais ce n'est pas ma façon de voir les choses ( et puis ici on ne fait pas le taff à la place des autres)
Je préfère que tu comprennes un minimum ... plutot que de copier/coller bêtement la réponse...
Donc si tu lieu de dire que ça ne mène à rien.. tu prenais 5 minutes pour lire et appliquer les conseilles qu'on te donne.. ça irait surement mieux...
Déjà.. on n'est pas frères ....
Ensuite.. je t'ai dit qu'une requête SQL ça se teste d'abord DANS PHPMYADMIN ...( et pas via le code php )
Une fois que ta requête te donnera les bonnes infos dans phpmyadmin... là tu pourras la mettre dans ton code php.
Ensuite..
Tu veux faire une somme en groupant par les "mois"
Il faut donc le SUM() .. et comme tu fais un GROUP BY MONTHNAME ... il ne faut garder dans la partie select que le MONTHNAME ..
Alors.. oui.. je pourrais te donner la requête à écrire ... mais ce n'est pas ma façon de voir les choses ( et puis ici on ne fait pas le taff à la place des autres)
Je préfère que tu comprennes un minimum ... plutot que de copier/coller bêtement la réponse...
Donc si tu lieu de dire que ça ne mène à rien.. tu prenais 5 minutes pour lire et appliquer les conseilles qu'on te donne.. ça irait surement mieux...
ok merci c'est gentil
d’après tes explications voici le code modifier :
affichage dans PHPMYADMIN :

maintenant comment afficher le sous total mois et le total année?
d'apres mon code :
affichage page web :

d’après tes explications voici le code modifier :
$sql = "SELECT date_appel, commentaires, nom_technicien, SUM(nombre_panne) as nombre_panne, MONTHNAME(date_appel) as MONTHNAME FROM rapports WHERE year(date_appel)='$year' AND nom_client='$nom_client' AND n_contrat='$n_contrat' AND repere='$repere' GROUP BY MONTH(date_appel), commentaires, nom_technicien";
affichage dans PHPMYADMIN :

maintenant comment afficher le sous total mois et le total année?
d'apres mon code :
<?php $connexion = mysqli_connect("localhost","root","","adminpanel") or die("Erreur de connexion."); if(ISSET($_POST['afficher_btn'])){ $year = $_POST['year']; $nom_client = $_POST['nom_client']; $n_contrat = $_POST['n_contrat']; $repere = $_POST['repere']; if($year != "" || $nom_client != "" || $n_contrat != "" || $repere != ""){ $sql = "SELECT date_appel, commentaires, nom_technicien, SUM(nombre_panne) as nombre_panne, MONTHNAME(date_appel) as MONTHNAME FROM rapports WHERE year(date_appel)='$year' AND nom_client='$nom_client' AND n_contrat='$n_contrat' AND repere='$repere' GROUP BY MONTH(date_appel), commentaires, nom_technicien"; $query = mysqli_query($connexion, $sql) or die(mysqli_error()); while($row = mysqli_fetch_array($query)){ echo '<tr>'; echo '<td>'.$row['date_appel'].'</td>'; echo '<td>'.$row['commentaires'].'</td>'; echo '<td>'.$row['nom_technicien'].'</td>'; echo '<td align=center>'.$row['nombre_panne'].'</td>'; echo '</tr>'; $total += $row['nombre_panne']; ?> <tr class="text-primary" align=center> <th colspan="3">Total <?php echo $row['date_appel'];?></th> <td><?php echo $row['nombre_panne']; ?></td> </tr> <?php } ?> <tr class="bg-light text-dark font-weight-bold"> <th colspan="3">TOTAL ANNEE</th> <td align=center><?php echo $total ?></td> </tr> <?php } } ?>
affichage page web :

$sql = "SELECT month(date_appel) as date_appel, commentaires, nom_technicien, SUM(nombre_panne) as nombre_panne, MONTHNAME(date_appel) as MONTHNAME FROM rapports WHERE year(date_appel)='$year' AND nom_client='$nom_client' AND n_contrat='$n_contrat' AND repere='$repere' GROUP BY MONTH(date_appel), commentaires, nom_technicien";