Statistiques Bis

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Statistiques Bis

Re: Statistiques Bis

par moogli » 11 août 2014, 00:58

salut,


a priori tu ne tape sur le bon tableau (celui issue de la requête avec les cases indiquée plus haut) ?

tu peux "voir" ce qu'il y a dans le tableau avec un var_dump.
ceci dit utiliser un IDE avec un débogueur (comme xdebug) est vraiment un plus limite indispensable ;)


@+

Re: Statistiques Bis

par moimeme30 » 07 août 2014, 21:25

Salut Yann, désolé, j'ai été très pris par le travail.
Alors j'ai testé ton code, mais ça me donne une erruer:
Notice: Undefined index: janv in
Notice: Undefined index: fev in
Notice: Undefined index: mars in
.............

Re: Statistiques Bis

par yann18 » 31 juil. 2014, 16:31

Pour ce qui est de ta requete, j'aimerai bien l'utiliser car au final elle m'affiche ce que je cherche, mais je ne sais pas du tout l'utiliser.
Comment pourrai je ensuite diviser rdv_par_mois par mois?
sans code il m'est difficile de te répondre.A quel niveau mon code te pose problème?

pour trouver le ratio, il faut d'abord parcourir le résultat de la requête puis extraire le nombre de rdv et le total des rdv par mois
foreach ( $tabRdv as $value ){
 //ratio du mois de janvier
 $tationJanv = $value['janv']/$value['total_rdvs_par_mois']; // ratio avec nombre à virgule
}
maintenant si tu veux trouver un ratio sous forme de fraction simplifiée il te faut determiner le pgcd de $value['janv'] et de total_rdvs_par_mois.On détermine le pgcd grâce à l'algorithme d'Euclide(je te laisse le soin de voir sur le net).

Pour ce qui est des rdv réalisés pour chaque membre et par mois il suffit d'ajouter dans le SELECT le nom du membre et l'ajouter aussi dans le GROUP BY

Re: Statistiques Bis

par moimeme30 » 29 juil. 2014, 12:29

Salut Yann,
J'ai pas tout compris là.
Pour reprendre mon précédent poste
ex: au mois de juillet j'ai rentré 4contacts mais je n'ai réalisé que 2rdv => 1/2
je n'ai pas besoin que SQL m'affiche 1/2, juste besoin qu'il m'affiche 2, je rajoute manuellement "1/" et j'obtiens ce que je recherche.
J'ai indiqué être le seul a rentrer les dates, ce n'est pas tout a fait juste car nous sommes une équipe, donc ça peut être moi, ou un autre de l'equipe. et nous avons pour nous identifier une colonne comm_id dans la table contacts.
donc l'idée serait de savoir combien j'ai eu de contacts et combien de rdv réalisés, mais de même pour les autres.
c'est pourquoi je reviens à ma 1ere idée:
case when month(date_rdv)='7' then count(*) / sum(rdv_pris) else 0 end 'Juil' from contacts group by comm_id
le problème c'est que lorsque j'applique cela à tous les mois, mon tableau affiche un chiffre à chaque comm_id mais uniquement sur le mois de juillet... alors que des chiffres devraient apparaître avant et après.
Pour ce qui est de ta requete, j'aimerai bien l'utiliser car au final elle m'affiche ce que je cherche, mais je ne sais pas du tout l'utiliser.
Comment pourrai je ensuite diviser rdv_par_mois par mois?

Re: Statistiques Bis

par yann18 » 28 juil. 2014, 23:05

ex: au mois de juillet j'ai rentré 4contacts mais je n'ai réalisé que 2rdv => 1/2
1/2 est une fraction irréductible, impossible de le faire en sql, c'est du côté de php qu'il faut écrire un algorithme qui détermine le pgcd entre 2 nombres(numérateur et dénominateur).
Quant à la requête, je te propose une requête qui sélectionne le nombre de rdv et le nombre total de contacts pour chaque mois donné. En parcourant le résultat de la requête tu dois pouvoir faire appel à une fonction php de simplification d'une fraction(comme énoncé plus haut). Cette fonction recevra en paramètre le nombre de rdv et le nombre total de contact.

$sql="
SELECT count(*) as total_rdvs_par_mois,  month(date_rdv) as mois,
 case when month(date_rdv)=1 then sum(rdv_pris) else 0  end 'janv',
 case when month(date_rdv)=2 then sum(rdv_pris) else 0  end 'fev',
  case when month(date_rdv)=3 then sum(rdv_pris) else 0 end 'mar',
  case when month(date_rdv)='4' then sum(rdv_pris) else 0 end 'avril',
  case when month(date_rdv)='5' then sum(rdv_pris) else 0 end 'mai',
  case when month(date_rdv)='6' then sum(rdv_pris) else 0 end 'juin',
   case when month(date_rdv)='7' then sum(rdv_pris) else 0 end 'juill',
  case when month(date_rdv)='8' then sum(rdv_pris) else 0 end 'aout'

FROM `contacts` WHERE year(date_rdv)=2014 group by mois

";
//à compléter jusqu'en décembre

cette requête retournera autant de lignes qu'il y a de mois en raison du regroupement par mois.Pour supprimer les lignes en trop qui ont toutes zéro(0) tu peux utiliser la fonction array_filter:
<?php

$sth=$dbh->prepare($sql);


$res=$sth->execute();
$data=$sth->fetchAll(PDO::FETCH_ASSOC);

$tabRdv=array();
foreach( $data as $k=>$val ) {
  $tabRdv[] = array_filter( $val );
}
var_dump( $tabRdv );
//pour afficher les données il faut parcourir avec foreach le tableau $tabRdv
?>

Re: Statistiques Bis

par moimeme30 » 28 juil. 2014, 00:59

Salut Yann, encore merci.
Mais je n'obtiens pas le résultat voulu.

la table contacts contient id, nom....rdv_pris, date_rdv
elle n'est pas destinée à une tierce personne mais à moi uniquement et il n'y a pas d'autres date de rdv à renseigner.
Lorsque j'enregistre un nouveau contact, j'enregistre automatiquement la date du jour dans date_rdv (j'aurai pu laissé sous forme 0000-00-00, mais pour d'autres fonctionnalités il me faut que cette colonne soit renseignée.C'est pourquoi je lui ai attribué la colonne rdv_pris. Lorsqu'elle est à 0 c'est que j'ai le contact mais je l'ai pas encore rencontré. Dans le cas au je le rencontre, rdv_pris prend 1.
Ensuite ma recherche est de savoir quel est le ratio sous forme de 1/2 ou 1/3 du nombre de rdv réalisés par rapport au nombre de contacts que j'ai enregistré.
ex: au mois de juillet j'ai rentré 4contacts mais je n'ai réalisé que 2rdv => 1/2
c'est pourquoi mon idée etait de compter le nombre de lignes du mois x et de le diviser par la somme des rdv_pris
(CASE WHEN MONTH(date_rdv) = 7 THEN (COUNT( date_rdv ) /*4rdv*// SUM( rdv_pris )/*1+1+0+0=2*/)  ELSE 0 END) Juil, /*=>4/2 = 2 => ratio: 1RDV réalisé pour 2 contacts enregsitrés 
je sais pas si j'ai été plus clair là :)

Re: Statistiques Bis

par yann18 » 27 juil. 2014, 22:18

si tu veux obtenir le ratio en % il faut multiplier le résultat de la division par 100:
//...
                COUNT(CASE WHEN MONTH(date_rdv) = 1 THEN 1 ELSE NULL END)/(SELECT COUNT(*) FROM contacts)*100 Jan,    

Re: Statistiques Bis

par yann18 » 27 juil. 2014, 22:16

bonjour,

à la base la conception de ta table contact pose problème . En effet avec ta conception, un utilisateur ne pourra prendre qu'un seul rdv(1er problème) et la création d'un utilisateur nécessite de renseigner inutilement les colonnes date_rdv et rdv_pris(2ème problème). Du coup ton application est trop rigide dans la mesure où un utilisateur ne pourra jamais prendre autant de RDV qu'il souhaite.

Une bonne modélisation voudrait qu'une table dédiée aux RDV soit créée et que cette dernière contienne l'id du contact et la date du RDV.L'avantage avec cette approche est que la prise d'un RDV entraîne l'insertion de l'id contact et la date du RDV dans la table des RDV ce qui facilite tout calcul sur les RDV.


Pour déterminer le ratio avec ta conception de départ tu peux essayer cette requête:

SELECT  e.nom, c.comm_id,
               COUNT(CASE WHEN MONTH(date_rdv) = 1 THEN 1 ELSE NULL END)/(SELECT COUNT(*) FROM contacts) Jan,    
               COUNT(CASE WHEN MONTH(date_rdv) = 2 THEN 1 ELSE NULL END)/(SELECT COUNT(*) FROM contacts) Fev,    
	       COUNT(CASE WHEN MONTH(date_rdv) = 3 THEN 1 ELSE NULL END)/(SELECT COUNT(*) FROM contacts) Mar, 
	      --idem pour tous les autres mois
           FROM contacts c INNER JOIN equipe e ON c.id_societe=17  AND c.comm_id=e.id 
	    AND YEAR(date_rdv)=2014 AND rdv_pris=1  GROUP BY e.nom

Statistiques Bis

par moimeme30 » 27 juil. 2014, 18:22

Bonjour,

Comme prevu, me revoici..
Je suis toujours dans mes statistiques.
dans ma table contacts, j'ai date_rdv (date) et rdv_pris(int 1)
des que je rentre un contact dans ma base de donnée, date_rdv prend comme valeur la date du jour et rdv_pris prend comme valeur 0.
Des que je réalise le rdv, alors date_rdv prend la valeur que je lui ai donné et rdv_pris prend comme valeur 1.
j'aimerai connaitre le ratio des rdv réalisés par rapport aux contacts que j'ai enregistré.
pour cela, je fais
COUNT(date_rdv) / SUM(rdv_pris)
jusque la ça à l'air de fonctionner.
Mais je désire avoir les données mois par mois sur l'année choisi.
Voici mon code qui me je ne sais trop quoi, peut etre une moyenne ou autre. quoiqu'il en soit, j'ai un résultat seulement dans un mois...
SELECT  e.nom, c.comm_id, 
		(CASE WHEN MONTH(date_rdv) = 1 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Jan,    
                (CASE WHEN MONTH(date_rdv) = 2 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Fev,    
                (CASE WHEN MONTH(date_rdv) = 3 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Mar,
                (CASE WHEN MONTH(date_rdv) = 4 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Avril,
                (CASE WHEN MONTH(date_rdv) = 5 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Mai,
		(CASE WHEN MONTH(date_rdv) = 6 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Juin,
		(CASE WHEN MONTH(date_rdv) = 7 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Juil,
		(CASE WHEN MONTH(date_rdv) = 8 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Aout,
		(CASE WHEN MONTH(date_rdv) = 9 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Sept,
		(CASE WHEN MONTH(date_rdv) = 10 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Oct,
                (CASE WHEN MONTH(date_rdv) = 11 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) Nov,
                (CASE WHEN MONTH(date_rdv) = 12 THEN (COUNT( date_rdv ) / SUM( rdv_pris ))  ELSE 0 END) `Dec`
		FROM contacts c INNER JOIN equipe e ON c.id_societe=17  AND c.comm_id=e.id  AND YEAR(date_rdv)=2014  GROUP BY e.nom
Une idée svp?