Cumul et comparaison de données

Eléphant du PHP | 94 Messages

05 sept. 2006, 09:25

Bonjour

J'ai une base de données mysql qui stocke des données par jour depuis 2 ans.
Je dois comparer les données cumulées par an : je dois donc afficher les données cumulées et faire un rapport entre les données obtenues.
ex : 2005 = 100 - 2006 = 110 - Delta = +10%

J'arrive à obtenir ce que je veux en faisant un group by sur l'année (que j'extrait d'un champ date de ma table).

Code : Tout sélectionner

$requete = "select YEAR(date) as an, sum(c1) as c1, sum(c2) as c2,sum(c3) as c3,sum(c4) as c4,sum(c5) as c5, sum(c6) as c6" . " from matable" . " where date between '$periode1' and '$periode2'" . " or date between '$periode1_an0' and '$periode2_an0'" . " group by an";
Et ensuite je réalise la boucle suivante :
	while ($eacamp = LigneSuivante($resultat))
		{
			$i++;
	
			$eacamp[ok] = $eacamp[c1]  + $eacamp[c2] + $eacamp[c3]+ $eacamp[c4] + $eacamp[c5];
			$eacamp[nok] = $eacamp[c6]  + $eacamp[c7]; 
			
			//Stockage des valeur par année
			if ($i==1) //2005
				{
				$comp1[ok]=$eacamp[ok];
				$comp1[nok]=$eacamp[nok];
				}
			if ($i==2) //2006
				{
				$comp2[ok]=$eacamp[ok];
				$comp2[nok]=$eacamp[nok];
				}
		}
			$comp[ok] = (($comp2[ok] /$comp1[ok])-1)*100;
			$comp[ok] = sprintf("%01.1f",$comp[ok])." %";
			$comp[nok] = (($comp2[nok] /$comp1[nok])-1)*100;
			$comp[nok]= sprintf("%01.1f",$comp[nok])." %";
Pour le moment cela fonctionne tant que j'ai 2 ans en base.
Mais quand je vais avoir 3 ans, cela ne fonctionnera plus sans adaptation.

Surtout, je voudrais faire la même chose par mois. Je souhaite modifier ma requete et mon code php pour pouvoir obtenir un tableau du type :

janvier an-1 / janvier an / delta
février an-1 / février an / delta
...

Comment faire ?
rspir

Eléphant du PHP | 94 Messages

09 sept. 2006, 22:35

Quelqu'un a t'il une idée pour m'aider ?
Modifié en dernier par rspir le 09 sept. 2006, 22:47, modifié 1 fois.
rspir

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

09 sept. 2006, 22:45

Bon même remarque que dans l'autre sujet, les "up", c'est relou.

Tu peux pas faire plus de calcul dans ta requête ? j'ai du mal à comprendre les calculs que tu veux faire exactement, et surtout l'utilité du $i. Pourquoi c'est possible avec 2 ans mais pas 3 ?

Eléphant du PHP | 94 Messages

09 sept. 2006, 23:02

Bon même remarque que dans l'autre sujet, les "up", c'est relou.
J'en conviens :oops: J'ai rectifié dans les 2 cas.
Tu peux pas faire plus de calcul dans ta requête ? j'ai du mal à comprendre les calculs que tu veux faire exactement, et surtout l'utilité du $i. Pourquoi c'est possible avec 2 ans mais pas 3 ?


Ce que je veux faire : un tableau avec la valeur de l'année -1, la valeur de l'année en cours et le delta : 100 / 110 / +10% (c'est à dire an-an_dernier/an_dernier)

Je veux arriver à le faire sur 2 ans ou en comparant 2 périodes ou 2 mois.

Pour le moment mon i compte le nombre de passage dans la boucle.
Au premier passage, je suis dans l'an dernier (et je stocke les valeurs)
Au second passage, je suis dans l'an en cours (et je stocke les valeurs)

Ensuite, je calcule mon delta.

Je cherche donc de l'aide pour améliorer tout cela
rspir

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

10 sept. 2006, 00:44

Pourquoi ne pas faire un tableau à 2 dimensions :
$valeur[indice][nom_de_la_valeur] ou $valeur[annee][nom_de_la_valeur]

Tu pourras facilement faire tes calculs ensuite, quelque soit le nombre de valeurs.

Je ne sais pas si c'est ce genre de pistes que tu attendais, mais ça me semblerait déjà un truc utile pour les stocker bien organisées.

Voilà, si j'ai bien suivi :
while ($eacamp = LigneSuivante($resultat)) {	
	$eacamp[$an]['ok'] = $eacamp['c1']  + $eacamp['c2'] + $eacamp['c3']+ $eacamp['c4'] + $eacamp['c5'];
	$eacamp[$an]['nok'] = $eacamp['c6']  + $eacamp['c7']; 
}

// on calcule les rapports entre années
foreach ($eacamp as $annee => $valeurs) { // pour chaque cellule année, on récupère un nouveau tableau $valeurs
	$i++;
	// on ne fait le calcul qu'à partir de la deuxième année
	if ($i) { 
		$eacamp[$annee]['delta_ok'] = ($eacamp[$annee][ok] /$eacamp[$annee-1][ok])*100;
		$eacamp[$annee]['delta_ok'] = sprintf("%01.1f",$eacamp[$annee]['delta_ok'])." %";

		$eacamp[$annee]['delta_nok'] = ($eacamp[$annee][nok] /$eacamp[$annee-1][nok])*100;
		$eacamp[$annee]['delta_nok'] = sprintf("%01.1f",$eacamp[$annee]['delta_nok'])." %";
	}
}