Fonction SQL SUM

Résolu
LaChaux78 Messages postés 583 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 14 janvier 2025 - 24 oct. 2024 à 17:25
LaChaux78 Messages postés 583 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 14 janvier 2025 - 25 oct. 2024 à 17:10

Bonjour, je souhaiterai additionner des valeurs stockée dans une colonne et regroupé par année. Je ne parviens pas à mettre en place la fonction SUM dans ma requête existante. Je vous remercie pour votre aide.

Voici une capture de ma table qui est concerné c'est le champs km.

Voici ma requête.

	$sql = "SELECT idfrais, bag_fraiskm.idtrajet, dtrajet, bag_fraiskm.km, bag_trajet.idtrajet, libelle, bag_trajet.km
		FROM bag_fraiskm
			LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
		WHERE YEAR(bag_fraiskm.dtrajet) = '$annee'
		ORDER BY dtrajet ASC";
	$result = executeQuery($sql,$datas);
	
	$nblignes = $result->rowCount();
	
	echo '<div class="nb_trajet"><h1>Liste de déplacements&nbsp;'.$annee.'&nbsp;Soit&nbsp;'.$donnees->totalkm.'Km</h1>';
	echo '<table width="80% border="0" cellpadding="0" cellspacing="0">';
	echo '<tr><td colspan="3" height="20" class="note">Année '.$annee.'</td><tr>';
	echo '<tr><td class="c2" height="20">Date</td><td class="c2" height="20">Trajet</td><td class="c2" height="20">km</td></tr>';

	if($nblignes) {
	
		while ($donnees = $result->fetch()) {
			echo '<tr>';
			echo '<td class="c3" height="20">'.dateFR($donnees->dtrajet).'</td>';
			echo '<td class="c3" height="20">'.$donnees->libelle.'</td>';
			echo '<td class="c3" height="20">'.$donnees->km.'</td>';
			echo '</tr>';
		}
	
	} else {
		echo '<tr><td colspan="2" class="no">Pas de saisie en '.$annee.'</td></tr>';
	}
		echo '</table>';
		echo '<p>Choisir une autre année : <input type="text" name="annee" size="4">';
		echo '<input type="submit" name="submit" value="Afficher"></p>';
		echo '</div>';

8 réponses

jee pee Messages postés 40737 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 janvier 2025 9 512
24 oct. 2024 à 19:12

Bonjour,

Quand on utilise SUM(), on ne peut pas avoir les lignes détails. Que veux tu additionner ? Pour les kms par année ce pourrait être :

SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, SUM(bag_trajet.km) AS TOTAL_KM
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
GROUP BY ANNEE;

Je te conseille de d’abord tester les requêtes dans mysqladmin pas directement dans php


0
LaChaux78 Messages postés 583 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 14 janvier 2025 32
24 oct. 2024 à 20:42

Bonjour, merci pour ton aide, j'ai testé ta requête dans phpmyadmin et c'est bien ce que je voulais.

Maintenant je vais essayer de l'adapter dans ma page. Que veux tu dire

Quand on utilise SUM(), on ne peut pas avoir les lignes détails

Merci

0
LaChaux78 Messages postés 583 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 14 janvier 2025 32
25 oct. 2024 à 09:05

Bonjour, je reviens vers toi, j'ai adapté ta requète sur ma page et il se trouve que cela ne me retourne uniquement 1 seule ligne, c'est à dire la première de la colonne.. Peux tu me dire ce que tu en penses, merci beaucoup.

	$sql = "SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, SUM(bag_trajet.km) AS TOTAL_KM, idfrais, bag_fraiskm.idtrajet, dtrajet, bag_fraiskm.km, bag_trajet.idtrajet, libelle, bag_trajet.km
		FROM bag_fraiskm
			LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
		WHERE YEAR(bag_fraiskm.dtrajet) = '$annee'
		GROUP BY ANNEE";
	$result = executeQuery($sql,$datas);	
	
	$nblignes = $result->rowCount();// Liste de déplacements

	if($nblignes) {
	
		while ($donnees = $result->fetch()) {
		
			echo '<div class="nb_trajet"><h1>Liste de déplacements&nbsp;'.$annee.'&nbsp;Soit&nbsp;'.$donnees->TOTAL_KM.'&nbsp;Km</h1>';
			echo '<table width="80% border="0" cellpadding="0" cellspacing="0">';
			echo '<tr><td colspan="3" height="20" class="note">Année '.$annee.'</td></tr>';
			echo '<td class="c2" height="20">Date</td><td class="c2" height="20">Trajet</td><td class="c2" height="20">km</td></tr>';

			echo '<tr>';
			echo '<td class="c3" height="20">'.dateFR($donnees->dtrajet).'</td>';
			echo '<td class="c3" height="20">'.$donnees->libelle.'</td>';
			echo '<td class="c3" height="20">'.$donnees->km.'</td>';
			echo '</tr>';
		}
	
	} else {
		echo '<div class="nb_trajet"><h1>Liste de déplacements&nbsp;'.$annee.'&nbsp;Soit&nbsp;'.$donnees->TOTAL_KM.'&nbsp;Km</h1>';
		echo '<table width="80% border="0" cellpadding="0" cellspacing="0">';
		echo '<tr><td colspan="3" height="20" class="note">Année '.$annee.'</td></tr>';
		echo '<td class="c2" height="20">Date</td><td class="c2" height="20">Trajet</td><td class="c2" height="20">km</td></tr>';
		echo '<tr><td colspan="2" class="no">Pas de saisie en '.$annee.'</td></tr>';
	}
		echo '</table>';
		echo '<p>Choisir une autre année : <input type="text" name="annee" size="4">';
		echo '<input type="submit" name="submit" value="Afficher"></p>';
		echo '</div>';
0
jee pee Messages postés 40737 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 janvier 2025 9 512
Modifié le 25 oct. 2024 à 10:21

Quand on utilise SUM(), on ne peut pas avoir les lignes détails

C'est exactement ce cas là, ta requete n'a pas de sens. Soit tu as la somme soit tu as les lignes détails. Pas les 2. Peut être peux tu faire le cumul des lignes en php ?

J'avais l'habitude de traiter des cas comme cela en faisant des unions de plusieurs requetes, là une pour les lignes, l'autre pour le total. A tester toujours dans phpmyadmin pour valider la syntaxe

SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, NULL AS TOTAL_KM, idfrais, bag_fraiskm.idtrajet, dtrajet, bag_fraiskm.km, bag_trajet.idtrajet, libelle, bag_trajet.km
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
WHERE YEAR(bag_fraiskm.dtrajet) = '2024'
UNION
SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, SUM(bag_trajet.km) AS TOTAL_KM, NULL, NULL, NULL, NULL, NULL, NULL, NULL
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
WHERE YEAR(bag_fraiskm.dtrajet) = '2024'
GROUP BY ANNEE;

Là comme on ne traite qu'une seule année, selectionnée par le WHERE, on pourrait même supprimer le group by


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jee pee Messages postés 40737 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 janvier 2025 9 512
25 oct. 2024 à 10:32

Il existe une option pas présente dans tous les SGBD, mais qui devrait marcher dans mysql, GROUP BY WITH ROLLUP

SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, SUM(bag_trajet.km) AS KM, idfrais, bag_fraiskm.idtrajet, dtrajet, bag_fraiskm.km, bag_trajet.idtrajet, libelle, bag_trajet.km
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
WHERE YEAR(bag_fraiskm.dtrajet) = '2024'
GROUP BY ANNEE WITH ROLLUP;

0
LaChaux78 Messages postés 583 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 14 janvier 2025 32
25 oct. 2024 à 15:41

Bonjour avec la commande UNION j'ai une ligne en trop lors du résultat.

SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, NULL AS TOTAL_KM, idfrais, bag_fraiskm.idtrajet, dtrajet, bag_fraiskm.km, bag_trajet.idtrajet, libelle, bag_trajet.km
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
WHERE YEAR(bag_fraiskm.dtrajet) = '2024'
UNION
SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, SUM(bag_trajet.km) AS TOTAL_KM, NULL, NULL, NULL, NULL, NULL, NULL, NULL
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
WHERE YEAR(bag_fraiskm.dtrajet) = '2024'
GROUP BY ANNEE;

Merci.

0
LaChaux78 Messages postés 583 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 14 janvier 2025 32
25 oct. 2024 à 16:05

Bonjour je verifie quelque chose et te redis je crois que c'est bon...

0
jee pee Messages postés 40737 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 janvier 2025 9 512
25 oct. 2024 à 16:26

Il y a nécessairement un ligne pour le total. Tu peux avoir une meilleure présentation avec

SELECT '' AS ANNEE, idfrais, bag_fraiskm.idtrajet, dtrajet, bag_fraiskm.km, bag_trajet.idtrajet, libelle, bag_trajet.km
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
WHERE YEAR(bag_fraiskm.dtrajet) = '2024'
UNION
SELECT YEAR(bag_fraiskm.dtrajet) AS ANNEE, '', '', 'TOTAL' , SUM(bag_trajet.km), '', '', ''
FROM bag_fraiskm
LEFT JOIN bag_trajet ON bag_trajet.idtrajet = bag_fraiskm.idtrajet
WHERE YEAR(bag_fraiskm.dtrajet) = '2024'
GROUP BY ANNEE;
0
LaChaux78 Messages postés 583 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 14 janvier 2025 32
25 oct. 2024 à 17:10

Un grand merci tout fonctionne normalement.

0