Cumul de données

Eléphant du PHP | 94 Messages

18 août 2006, 14:13

Bonjour

Je dispose d'une table mysql organisée de la manière suivante :

un enregistrement =
-> une discipline (il s'agit de course d'athlé, on peut avoir le 80m, le 100m, ...)
-> une date
-> un T1 (un entier)
-> un T2 (un entier)
-> un T3 (un entier)

Pour une journée je peux avoir un enregistrement par discipline

Pour le moment, pour afficher les données d'une journée donnée, je procède ainsi :

-> récupération des données mysql dans un tableau
-> j'affiche les infos dans un tableau html en créant une ligne avec une boucle while

Je souhaite maintenant faire des restitutions par période.
Je souhaite donc obtenir une restitution avec un ligne par discipline (même si celle ci apparait plusieurs fois dans la période) et cumuler des T1 dans la période, le cumul des T2 et le cumul des T3.

Par exemple si j'ai :

Date Disc. T1 T2 T3
01/01/2006 80m 1 2 1
02/01/2006 80m 5 3 4
02/01/2006 100m 1 1 3

Pour la période du 01/01/2006 au 02/01/2006, je veux :
Disc. T1 T2 T3
80m 6 5 5
100m 5 3 4

J'ai essayé de fair un group by discipline dans ma requete sql : cela ne m'affiche qu'une ligne par discipline (ce qui est parfait) mais cela ne cumule pas les T1, T2 et T3.

Comment faire pour réaliser les cumul ?
rspir

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 août 2006, 14:17

J'ai essayé de fair un group by discipline dans ma requete sql : cela ne m'affiche qu'une ligne par discipline (ce qui est parfait) mais cela ne cumule pas les T1, T2 et T3.
On peut voir comment tu as fais ça ?

A priori tu as compris le principe, sauf qu'il faut indiquer à MySQL de faire les calculs (somme, moyenne, compte etc.) ;)

12.9.1. Fonctions avec GROUP BY

Eléphant du PHP | 94 Messages

18 août 2006, 14:38

Bah pour le moment, j'ai juste testé ceci :

Code : Tout sélectionner

SELECT * FROM test WHERE date BETWEEN 20060814 AND 20060818 GROUP BY discipline ;
Effectivement, je ne savais pas que l'on pouvait faire un SUM dès la requete dans mysql ... je pensais qu'il fallait bricoler et faire une boucle de plus en php.

Je viens de tester. Cela donne maintenant ceci :

Code : Tout sélectionner

SELECT date, discipline, t1, t2, t3, sum( t1 ) , sum( t2 ) , sum( t3 ) FROM test WHERE date BETWEEN 20060814 AND 20060818 GROUP BY discipline
Et ca marche dans phpmyadmin. MERCI !!!!!!!!!!!!!!!
Bon maintenant, il faut que je revois un peu mon code php : j'avais dans l'idée de proposer un formulaire où l'utilisateur aurait pu demander :
-> une seule date,
-> un mois, (que j'aurais calculé en fonction de la date courante)
-> une semaine (que j'aurais églament calculé en fonction de la date courante)
-> un période libre (saisie par l'utilisateur d'une date de début et d'une date de fin).

Pour simplifier le tout, je pensais n'utiliser qu'une seule requête avec une condition where que j'aurais modifier avec uns witch/case selon le choix de l'utilisateur.

Ceci dit, en voyant cette requête mysql, je peux me contenter de ne laisser uniquement que la période libre et de laisser l'utilisateur saisir deux fois la même date si'il ne veut qu'une journée (16/08/2006 au 16/08/2006) .

Je ne sais pas si cela fait très "sérieux" de procéder ainsi
rspir

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 août 2006, 14:51

Il y a des colonnes qui ne servent à rien du coup : date, t1, t2 et t3 puisque tu fais des calculs et un regroupement.

Code : Tout sélectionner

SELECT discipline, sum( t1 ) AS somme_t1, sum( t2 ) AS somme_t2 , sum( t3 ) AS somme_t3 FROM test WHERE date BETWEEN 20060814 AND 20060818 GROUP BY discipline
J'ai rajouté des alias (avec AS) pour les colonnes calculées) sinon tu vas galérer à les récupérer via PHP.

Quel est le type de la colonne date que tu utilises ?

Pour ton formulaire c'est à toi de voir, mais tu peux très bien faire plusieurs modèles de requêtes suivant les critères choisis, exemple :
$requete ='SELECT discipline, sum( t1 ) AS somme_t1, sum( t2 ) AS somme_t2 , sum( t3 ) AS somme_t3 FROM test ';

// éventuellement rajouter une condition par défaut
switch($type_group) {
		case 'jour' : $where = ' WHERE date = '.$critere_jour; break;// critère jour récupéré du formulaire
		case 'semaine' : $where = ' WHERE date BETWEEN 20060814 AND 20060818'; break; // ici tu calcules le jour de début et le jour de fin de la semaine
		case 'mois' : $where = ' WHERE date BETWEEN 2006'.critere_mois.'01 AND 2006'.critere_mois.'31'; break; // ici tu prends du 1er au 31 du mois choisi
		case 'periode' : $where = ' WHERE date BETWEEN '.$debut_periode.' AND '.$fin_periode; break; // ici tu prends les bornes indiquées, en vérifiant  que celle du début est inférieure à celle de fin
}

$requete .= $where; // on colle la condition choisie au code SQL du début
$requete .= ' GROUP BY discipline'; // on rajoute le regroupement
Tu as tout un tas de fonctions pour manipuler les dates avec MySQL (à condition d'utiliser le type DATE pour ta colonne)
Tu peux regarder dans la FAQ des exemples : http://www.phpfrance.com/forums/voir_sujet-8323.php

Eléphant du PHP | 94 Messages

18 août 2006, 15:20

Je suis justement sur le sujet des dates.
J'avais bien lu, ce matin, le tuto que tu m'as conseillé.
Et je fais un mix de manipulation des dates dans mysql et dans php

Mon champ mysql est un champ de type date.

Du coup je fais ceci :
-> je récupère la dernière date (la + récente) dans la table mysql et je la récupère une seconde fois en la formatant :

Code : Tout sélectionner

$reqdate="select date, DATE_FORMAT(date, '%d/%m/%Y') AS 'dat_aff' from test order by date desc limit 1";
ainsi j'ai 2 valeurs : une valeur que j'utilise pour mes requetes et une valeur pour l'affichage

-> si l'utilisateur n'a rien saisi, j'utilise $reqdate->date dans ma requete comme valeur par défaut et j'affiche $reqdate->dat_aff à l'écran

-> si l'utilisateur a saisi dans le formulaire les dates, j'affiche sa saisie, et je convertis les dates saisies au format aaaammjj pour ma requete

Enfin, je suis en train de le faire ... :(
Et après va falloir mettre des controles dans le formulaire pour vérifier la saisie conforme des dates et que la date1 soit <= à la date 2 etc ...

EDIT : au final mon histoire de date donne ceci :
	$reqdate="select DATE_FORMAT(date, '%d/%m/%Y') AS 'date_fr',date from test order by date desc limit 1"; // je récupère la dernière journée
	$resdate = ExecRequete ($reqdate, $connexion); //requete
	$datecamp = ObjetSuivant ($resdate); //recup variable
	$dat_sql=$datecamp->date; // stockage variable
	$dat_aff=$datecamp->date_fr; // stockage variable
			
	$dat_aff1=$_POST['DATE1']; //récup données formulaire
	$dat_aff2=$_POST['DATE2']; //récup données formulaire

	if ((empty($dat_aff1) || $dat_aff1=="") and (empty($dat_aff2) || $dat_aff2=="")) // je teste si saisie dans le formulaire
		{
			$dat_aff1=$dat_aff; // données affichage
			$dat_aff2=$dat_aff;
			$periode1=$dat_sql;// données requetes
			$periode2=$dat_sql;
		}	
	else
		{
		list($jour1, $mois1, $annee1) = explode("/", $dat_aff1); // conversion
		$periode1 = $annee1 . $mois1 . $jour1;  // données requetes

		list($jour2, $mois2, $annee2) = explode("/", $dat_aff2);
		$periode2 = $annee2 . $mois2 . $jour2;  
		}
rspir

Lynda
Invité n'ayant pas de compte PHPfrance

04 mars 2013, 11:17

Bonjour,
Je souhaite également faire un cumul de données.
Je pense que sum() convient bien mais je ne sais pas bien où le placer dans mon code de traitement.
Je voudrais que le cumul de données s'affiche dans un mail (à la réception).
Quelqu'un saurait-il m'aider ?
Merciii

Lynda