Somme des dernières entrées

Somme des dernières entrées - SQL/NoSQL - Programmation

Marsh Posté le 18-10-2006 à 10:55:17    

Bonjour,
 
J'explique mon soucis, en fait chaque matin, un formulaire est rempli, la date se fait automatiquement via du php et il y a aussi une colonne qui s'incrémente de 1 à chaque entrée.
Et donc je voudrais que les 7 dernières entrées de la colonne 'total' soient additionné pour en faire un total sur les 7 derniers jours.
 
Voici la table :
 

Code :
  1. CREATE TABLE district1 (
  2. id int(255) NOT NULL auto_increment,
  3. date varchar(255) NOT NULL default '',
  4. xxxx1 varchar(255) NOT NULL default '',
  5. xxxx2 varchar(255) NOT NULL default '',
  6. xxxx3 varchar(255) NOT NULL default '',
  7. xxxx4 varchar(255) NOT NULL default '',
  8. xxxx5 varchar(255) NOT NULL default '',
  9. xxxx6 varchar(255) NOT NULL default '',
  10. total varchar(255) NOT NULL default '',
  11. PRIMARY KEY (id)
  12. ) TYPE=MyISAM;


 
et le bout de code :
 

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxxxxx', 'xxxxxxxxx');
  3. mysql_select_db('xxxxxxxxxx',$db);
  4. $sql = 'SELECT SUM(total) as masomme FROM district1;
  5. $somme = mysql_query($sql) or die ('Erreur : '.mysql_error() );
  6. $detail = mysql_fetch_assoc($somme);
  7. echo "Le total est de : " . $detail['masomme'] . "<br> Sur les 7 derniers jours<br>";
  8. mysql_close();
  9. ?>

Reply

Marsh Posté le 18-10-2006 à 10:55:17   

Reply

Marsh Posté le 18-10-2006 à 11:05:27    

tu veux le total des 7 dernières entrées ou des 7 derniers jours? Car j'imagine qu'il y a peut-être des jours sans entrées....

Reply

Marsh Posté le 18-10-2006 à 11:34:10    

anapajari a écrit :

tu veux le total des 7 dernières entrées ou des 7 derniers jours? Car j'imagine qu'il y a peut-être des jours sans entrées....


 
il y a obligatoirement une entrée par jour donc pas de soucis de ce côté là ;)
 
Par contre je vois le problem des mois avec 30 et 31 jours qui arrive, mais une chose à la fois  :whistle:

Reply

Marsh Posté le 18-10-2006 à 11:50:47    

Code :
  1. SELECT SUM(total) as masomme FROM district1 where date > DATE_SUB(CURDATE(),INTERVAL 7 DAYS)

Reply

Marsh Posté le 18-10-2006 à 12:00:42    

Merci de ton aide, mais j'ai un message d'erreur :
 

Erreur : You have an error in your SQL syntax near 'DAYS)' at line 1


 
Peu être que cela vient de la façon dont le formulaire est rempli :
 

Code :
  1. <input name="date" type="text" value ="<?php
  2.       $date = date("d-m-Y" );
  3.       echo "$date";
  4.       ?>" size="10" maxlength="10" />

Reply

Marsh Posté le 18-10-2006 à 14:04:54    

affiche la requete que tu executes stp!

Reply

Marsh Posté le 18-10-2006 à 15:20:23    

anapajari a écrit :

affiche la requete que tu executes stp!


ceci ?
 

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxxx', 'xxxxxxx');
  3. mysql_select_db('xxxxxxx',$db);
  4. $sql = "INSERT INTO district1
  5. VALUES('$id','$date','$xxxx1','$xxxx2','$xxxx3','$xxxx4','$xxxx5','$xxxx6','$total')";
  6. mysql_query($sql)
  7. or die('Erreur SQL !'.$sql.'
  8. '.mysql_error());
  9. echo '<span style="font-family : Verdana; font-size : 10pt; color : #333333"><strong> Merci beaucoup, vos informations ont été enregistrées.</strong></span>';
  10. mysql_close();
  11. ?>

Reply

Marsh Posté le 18-10-2006 à 15:50:50    

donc non pas ceci :o
 
Tu dois avoir  
 
Ce bout de code la:

Code :
  1. $sql = 'SELECT SUM(total) as masomme FROM district1;
  2. $somme = mysql_query($sql) or die ('Erreur : '.mysql_error() );


Quand la requete pete il affiche ton erreur change le die en

Code :
  1. die('Erreur sur la requete:'.$sql.'--'.mysql_erro()


Relance ton truc, et dis nous ce qu'il affiche
 

Spoiler :

bien envie de relancer de 3 charentaises et pour pouvoir sortir un "pâté de chat et rouflaquettes" sur ce topic...


Reply

Marsh Posté le 18-10-2006 à 16:00:47    

J'ai semble t'il résolu mon problem avec ceci :

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxxxxx', 'xxxxxxxxx');
  3. mysql_select_db('xxxxxxxxxx',$db);
  4. $sql = 'SELECT total,id FROM district1 ORDER BY id DESC LIMIT 7;
  5. $result = mysql_query($sql) or die ('Erreur : '.mysql_error() );
  6. $total = 0;
  7. while ($res = mysql_fetch_array($result))
  8.   $total += $res['total'];
  9. echo "Le total est de : " . $total . "<br> Sur les 7 derniers jours<br>";
  10. mysql_close();
  11. ?>


 
Cela te semble t'il du "bon" code ?
 
Cela me règle le problem pour les 7 derniers jours, mais pour la fin du mois, sachant qu'il y a parfois 30 où 31 jours, quel serait la meilleur solution ?


Message édité par athome le 18-10-2006 à 16:01:41
Reply

Marsh Posté le 18-10-2006 à 19:01:07    

Tu veux les 7 derniers jours, que tu sois le 1er, le 31 ou le 17 t'auras les 7 derniers jours, l'est où le problème :??:

Reply

Marsh Posté le 18-10-2006 à 19:01:07   

Reply

Marsh Posté le 18-10-2006 à 20:15:36    

leflos5 a écrit :

Tu veux les 7 derniers jours, que tu sois le 1er, le 31 ou le 17 t'auras les 7 derniers jours, l'est où le problème :??:

Je donne un indice :
date varchar(255) NOT NULL default '',  :whistle:  
 
(avec ce genre de structure, forcément, il y a des problèmes qui se posent)

Reply

Marsh Posté le 18-10-2006 à 21:11:05    

mrbebert a écrit :

Je donne un indice :
date varchar(255) NOT NULL default '',  :whistle:  
 
(avec ce genre de structure, forcément, il y a des problèmes qui se posent)


J'avais pas vu (ni penser qu'on puisse faire ça...)  m'enfin ça dit pas pourquoi y'aurait un souci avec le 30-31 :??:
 
Je dirais bien que pour eviter de suite toute surprise ou effort inutile, il suffit de donner le vrai type à l'attribut :whistle:

Reply

Marsh Posté le 18-10-2006 à 21:42:17    

Oui, effectivement, vu qu'il trie sur la colonne "id", je vois pas non plus le problème avec le 30-31 :pt1cable:  
(en fait, comme il ne prend pas en compte la date, il n'y a pas du tout de souci de date :whistle: )

Reply

Marsh Posté le 19-10-2006 à 11:27:55    

mrbebert a écrit :

Oui, effectivement, vu qu'il trie sur la colonne "id", je vois pas non plus le problème avec le 30-31 :pt1cable:  
(en fait, comme il ne prend pas en compte la date, il n'y a pas du tout de souci de date :whistle: )


 
Bien en fait j'ai une page qui affiche les résultats et qui donne ceci :
 

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
  3. mysql_select_db('xxxxxx',$db);
  4. $sql = 'SELECT total,id FROM district1 ORDER BY id DESC LIMIT 30';
  5. $result = mysql_query($sql) OR die ('Erreur : '.mysql_error() );
  6. $total = 0;
  7. while ($res = mysql_fetch_array($result))
  8.   $total += $res['total'];
  9. echo "<font size='2' color='#ff0000' face='Verdana, Arial, Helvetica, sans-serif'>Le total est de : " . $total . "<br> Sur les 30 derniers jours</font><br>";
  10. mysql_close();
  11. ?>


 
Donc il est écrit en dur 'Sur les 30 derniers jours' mais le soucis c'est quand on est le 31 il manque le 1er du mois  :pt1cable:  

Reply

Marsh Posté le 19-10-2006 à 11:28:39    

Donc j'ai changé mes tables comme ceci :
 

Code :
  1. CREATE TABLE district1 (
  2.   id int(255) NOT NULL auto_increment,
  3.   jour varchar(255) NOT NULL default '',
  4.   mois varchar(255) NOT NULL default '',
  5.   annee varchar(255) NOT NULL default '',
  6.   xxxx1 varchar(255) NOT NULL default '',
  7.   xxxx2 varchar(255) NOT NULL default '',
  8.   xxxx3 varchar(255) NOT NULL default '',
  9.   xxxx4 varchar(255) NOT NULL default '',
  10.   xxxx5 varchar(255) NOT NULL default '',
  11.   xxxx6 varchar(255) NOT NULL default '',
  12.   total varchar(255) NOT NULL default '',
  13.   PRIMARY KEY  (id)
  14. ) TYPE=MyISAM;


 
Je pense qu'avec le champ 'mois' qui est rempli avec soit '01' '02'... je peux afficher le total par mois. Voici le formulaire pour info :
 

Code :
  1. Jour
  2.                       <input name="jour" type="text" value ="<?php
  3.        $jour = date("d" );
  4.        echo "$jour";
  5.        ?>" size="2" maxlength="2" />
  6.                       Mois
  7.                       <input name="mois" type="text" value ="<?php
  8.        $mois = date("m" );
  9.        echo "$mois";
  10.        ?>" size="2" maxlength="2" />
  11.                       Ann&eacute;e
  12.                       <input name="annee" type="text" value ="<?php
  13.        $annee = date("Y" );
  14.        echo "$annee";
  15.        ?>" size="4" maxlength="4" />


 
 
Voici l'ancien code qui me permettais d'afficher les 30 derniers jours, mais, comment additionner seulement ceux d'une meme valeur dans la colonne 'mois' ?
 

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
  3. mysql_select_db('xxxxxx',$db);
  4. $sql = 'SELECT total,id FROM district1 ORDER BY id DESC LIMIT 30';
  5. $result = mysql_query($sql) or die ('Erreur : '.mysql_error() );
  6. $total = 0;
  7. while ($res = mysql_fetch_array($result))
  8.   $total += $res['total'];
  9. echo "<font size='2' color='#ff0000' face='Verdana, Arial, Helvetica, sans-serif'>Le total est de : " . $total . "<br> Sur les 30 derniers jours</font><br>";
  10. mysql_close();
  11. ?>


 
Merci encore

Reply

Marsh Posté le 19-10-2006 à 11:31:26    

Comprends rien ... [:w3c compliant]
Tu veux les trentes derniers jours:

Code :
  1. SELECT SUM(total) as masomme FROM district1 where date > DATE_SUB(CURDATE(),INTERVAL 30 DAYS)


Tu veux le mois dernier(qu'il y ait ou non 31 jours):

Code :
  1. SELECT SUM(total) as masomme FROM district1 where date > DATE_SUB(CURDATE(),INTERVAL 1 MONTHS)


Tu veux le "mois en cours" ( si on est le 1er: un seul jour; si on est le 31, 31 jours):

Code :
  1. SELECT SUM(total) as masomme FROM district1 where MONTH(date)=MONTH(CURDATE()) AND YEAR(date)=YEAR(CURDATE())


 
edit: c'est une hérésie de splitter une date en trois champs parce qu'on ne connait pas les "bonnes" fonctions sql...
Je pense avoir enfin compris ce que tu voulais, il s'agissait de la 3eme requete, qui aurait très bien fonctionné si tu n'avais pas changé la structure de ta table :o

Message cité 1 fois
Message édité par anapajari le 19-10-2006 à 11:33:40
Reply

Marsh Posté le 19-10-2006 à 11:38:12    

anapajari a écrit :

Comprends rien ... [:w3c compliant]


 
En fait je veux le total du mois de janvier '01', fevrier '02' ... à n'importe quel moment de l'année je me trouve
 
Les 7 derniers jours c'était que pour le lundi matin cela fasse une semaine, donc là ca fonctionne. Mais les 30 derniers jours (pour 1 mois) cela ne fonctionne pas vu que tous les mois n'on pas le meme nombre de jours  :whistle:

Reply

Marsh Posté le 19-10-2006 à 11:40:30    

oui bien ce que je disais 3eme requête, sauf que tu changes le:

Code :
  1. MONTH(date)=MONTH(CURDATE()) AND YEAR(date)=YEAR(CURDATE())


si tu veux février 2006, tu mets:

Code :
  1. MONTH(date)=2 AND YEAR(date)=2006


Message édité par anapajari le 19-10-2006 à 11:40:53
Reply

Marsh Posté le 19-10-2006 à 12:19:04    

Je n'ai pas de message d'erreur mais le résultat est zéro alors qu'il devrait être de 6
 

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
  3. mysql_select_db('xxxxxx',$db);
  4. $sql = 'SELECT SUM(total) as masomme FROM district1 where MONTH(mois)=10 AND YEAR(annee)=2006';
  5. $result = mysql_query($sql) or die ('Erreur : '.mysql_error() );
  6. $total = 0;
  7. while ($res = mysql_fetch_array($result))
  8.   $total += $res['total'];
  9. echo "<font size='2' color='#ff0000' face='Verdana, Arial, Helvetica, sans-serif'>Octobre 2006 : " . $total . "<br><br>";
  10. mysql_close();
  11. ?

Reply

Marsh Posté le 19-10-2006 à 12:27:47    

tu lis ton code des fois ????

Citation :

$sql = 'SELECT SUM(total) as masomme FROM district1 where MONTH(mois)=10 AND YEAR(annee)=2006';
...
$total += $res['total'];


s'pas gagné hein :o

Reply

Marsh Posté le 19-10-2006 à 12:41:12    

anapajari a écrit :

tu lis ton code des fois ????
 
s'pas gagné hein :o


 
 :sleep:  Je débute, alors tout ne me saute pas aux yeux  :ange:  
 
Mais j'ai toujours zéro qui m'est retourné au lieu de 6
 

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
  3. mysql_select_db('xxxxxx',$db);
  4. $sql = 'SELECT SUM(total) as masomme FROM district1 where MONTH(mois)=10 AND YEAR(annee)=2006';
  5. $result = mysql_query($sql) or die ('Erreur : '.mysql_error() );
  6. $total = 0;
  7. while ($res = mysql_fetch_array($result))
  8.   $total += $res['masomme'];
  9. echo "<font size='2' color='#ff0000' face='Verdana, Arial, Helvetica, sans-serif'>Octobre 2006 : " . $total . "<br><br>";
  10. mysql_close();
  11. ?>

Reply

Marsh Posté le 19-10-2006 à 12:55:31    

[quotemsg=1460351,16,8c'est une hérésie de splitter une date en trois champs parce qu'on ne connait pas les "bonnes" fonctions sql...
Je pense avoir enfin compris ce que tu voulais, il s'agissait de la 3eme requete, qui aurait très bien fonctionné si tu n'avais pas changé la structure de ta table :o[/quotemsg]
 

athome a écrit :

$sql = 'SELECT SUM(total) as masomme FROM district1 where MONTH(mois)=10 AND YEAR(annee)=2006';


Euh j'avais dit plus haut que ça ne marcherait que si tu remettais l'ancienne structure de date et pas ce nawak qui est la séparation entre trois champs.
YEAR et MONTH sont des fonctions qui s'appliquent sur un champs date !
 

Reply

Marsh Posté le 19-10-2006 à 13:10:51    

anapajari a écrit :

C'est une hérésie de splitter une date en trois champs parce qu'on ne connait pas les "bonnes" fonctions sql...
Je pense avoir enfin compris ce que tu voulais, il s'agissait de la 3eme requete, qui aurait très bien fonctionné si tu n'avais pas changé la structure de ta table :o
 
Euh j'avais dit plus haut que ça ne marcherait que si tu remettais l'ancienne structure de date et pas ce nawak qui est la séparation entre trois champs.
YEAR et MONTH sont des fonctions qui s'appliquent sur un champs date !


 
Euh en fait, je préfère que les users puissent modifier la date jj-mm-aa, s'ils ratent un jour :) et ma version de mysql ne me permet pas de convertir je crois : 3.23.39
 
Donc j'ai fais trois champs 'jour' 'mois' et 'annee' et puis trier la colonne 'mois' et additionner tous les '10' (octobre) par exemple, je sais que ce n'est du code pur mais à mon niveau c'est la seule façon simple que j'ai trouvé  :sweat:  
 
Donc si tu as une idée sans les fonctions YEAR et MONTH, je suis preneur  :jap:  ?

Reply

Marsh Posté le 19-10-2006 à 13:25:18    

cela semble fonctionner
 

Code :
  1. <?PHP
  2. $db = mysql_connect('localhost', 'xxxxxx', 'xxxxxx');
  3. mysql_select_db('xxxxxx',$db);
  4. $sql = 'SELECT SUM(total) as masomme FROM district1 where mois=10 AND annee=2006';
  5. $result = mysql_query($sql) or die ('Erreur : '.mysql_error() );
  6. $total = 0;
  7. while ($res = mysql_fetch_array($result))
  8.   $total += $res['masomme'];
  9. echo "<font size='2' color='#ff0000' face='Verdana, Arial, Helvetica, sans-serif'>Octobre 2006 : " . $total . "<br><br>";
  10. mysql_close();
  11. ?>


 
Peu tu me dire si cela est bon ?

Reply

Marsh Posté le 19-10-2006 à 15:47:33    

CA à l'air mais t'es têtu!
 
Pourquoi faire un truc crade à souhait, qui va te prendre la tête dès que tu auras besoin de faire un truc supplémentaire :??:
 
Tu mets une date de type date et tu pourras faire ce que tu veux, 30 ou 31 jours, février ou octobre, modification de la date ou non :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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