Vous n'êtes pas identifié(e).
Bonjour à tous,
Je m'arrache les cheveux pour calculer un indice de jour de stock, en gros, combien de temps en moyenne reste un enregistrement dans ma base de données.
J'ai donc une table avec deux champs DateTime sous Mysql : DateReception et DateExpedition
Voici la structure de ma table:
IdProduit - IdProvenance - NumeroLivraison - DateReception - DateExpedition
J'avoue que j'ai essayé des dizaines et des dizaines de solutions, mais aucunes ne fonctionnes.
Avez vous une solution concernant le problème cité ? Est ce qu'il faut à votre avis utiliser des fonctions Mysql (AVG, SUM) ou qu'il faut passer par PHP en sachant qu'il y a 150 - 200 enregistrements à comparer ?
J'ai essayé de faire des recherches sur google mais il y a à boire et à manger, j'ai un peu essayé tout ce que j'ai vue sans succès ...
Merci à vous,
Antho
Hors ligne
Bonsoir,
Tu as de la chance, j'ai beaucoup de mal pour ne par dire énormément à résister à un problème MySQL.
Laisse moi reformuler pour voir si j'ai bien compris ta question, car c'est la première chose à faire pour réussir facilement à établir la bonne requête.
Tu veux connaître combien de temps en moyenne chaque produit de ta base de donnée reste en stock?, dis-nous juste à quel format tu veux que ce temps soit exprimé (en jours? en mois? sous la forme "1 mois, 3 jours et 5s" ou "1,4 mois", etc...)
Dans tous les cas, soit précis dans ta réponse, et on te sors d'affaire
EDIT: j'oubliais, tu veux la réponse pour une période donnée ? du style l'année en cours? etc.. (bcp plus pertinent sur une grosse base de données)
Dernière modification par Jc (21-10-2011 00:44:00)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
A la bonheur ! J'en bave déjà lol !
Tu as parfaitement compris mon problème, je veux savoir en combien mes produits restent en stock mais pas forcément pour chaque produit mais pour le global.
Par exemple :
Sur les 5000 derniers enregistrements, les produits sont restés 14.7 jours en moyenne en stock
Je souhaite que le résultat soit exprimé en jours.
Merci JC !!
Hors ligne
Saluton,
Faire un AVG d'un TIME_DIFF avec un formatage, y-a vraiment pas de quoi baver.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Bonsoir,
Voici la requête pour les 5000 derniers enregistrements. Filtre à adapter selon tes besoins (année, etc...). Si tu as moins de 5000 enregistrements dans ta base fait un <= pour avoir un résultat.
Note: la requête ci-dessus pour être exact ne recense pas les 5000 derniers enregistrements mais les 5000 dernières receptions, que tu peux remplacer par les expéditions.
++
Dernière modification par Jc (21-10-2011 21:55:36)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Saluton,
Faire un AVG d'un TIME_DIFF avec un formatage, y-a vraiment pas de quoi baver.
J'avais déjà essayé mais j'avais un résultat un peu bizarre (pour ne pas dire étrange :-p) ...
Bonsoir,
Voici la requête pour les 5000 derniers enregistrements. Filtre à adapter selon tes besoins (année, etc...). Si tu as moins de 5000 enregistrements dans ta base fait un <= pour avoir un résultat.
SELECT AVG(UNIX_TIMESTAMP(DateExpedition)-UNIX_TIMESTAMP(DateReception))/86400 FROM myTable GROUP BY IdProduit HAVING count(IdProduit)=5000 ORDER BY DateReception DESC
Note: la requête ci-dessus pour être exact ne recense pas les 5000 derniers enregistrements mais les 5000 dernières receptions, que tu peux remplacer par les expéditions.
++
Merci beaucoup JC
Je n'ai jamais vue une requête comme ça mais j'ai une question. Dois-je faire une boucle pour afficher le résultat si oui, comment afficher le résultat de façon groupé (par exemple : Moyenne: '14' jours) ? Car quand je fais un While, j'ai un résultat avec des milliers de chiffres ...
Merci à vous pour votre aide, vous êtes incroyables !
Dernière modification par Anthotill (22-10-2011 07:42:40)
Hors ligne
Bonjour,
En fait tu n'as besoin d'aucune boucle. La requête te retourne 1 seul résultat, celui que tu cherches.
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Pour répondre exactement à ta question, tu fais un truc du genre:
.
Bonne continuation.
Dernière modification par Jc (22-10-2011 08:00:50)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Pour répondre exactement à ta question, tu fais un truc du genre:
print "moyenne=".$result[0]." jours";.
Bonne continuation.
Merci tu es sympa.
A l'affichage j'obtiens : moyenne 0.00005787 jours
J'ai rajouté à la requête WHERE DateExpedition != '0000-00-00 00:00:00' car parfois des produits (volés par exemple) ne sorte pas du stock côté logiciel (maaaalllhheereusement !)
Hors ligne
En fait la requête calcule le temps moyen en secondes, et c'est pour cela qu'il faut diviser par 86400 pour l'avoir en jours. Pour ta condition, je n'ai pas eu le temps de vérifier le comportement de la requête mais il te faut l'inclure dans le HAVING et non pas le rajouter dans un WHERE.
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
il te faut l'inclure dans le HAVING et non pas le rajouter dans un WHERE.
J'aimerais comprendre, cela est-il plus performant ou c'est parce que c'est plus "propre" ?
Au niveau du résultat obtenu, en faisant ORDER BY DateEpexidiotn j'obtiens quelque chose de plus cohérent.
Pour ta condition, je n'ai pas eu le temps de vérifier le comportement de la requête
Raison de plus pour te remercier infiniment de ton aide, prendre le temps que tu n'as pas pour m'aider (et aider les autres) c'est très gentil.
Dernière modification par Anthotill (22-10-2011 08:23:30)
Hors ligne
Bon excuses ^^
Je viens de test, et il faut que tu fasses,
Pour un tri sur les 5000 derniers enregistrements je reviens vers toi, car il faut passer par un autre style de requête et j'ai pas le temps maintenant.
Par contre elle est suffisante pour les tris normaux (année courrante, mois donné, etc...)
Dernière modification par Jc (22-10-2011 08:31:29)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon excuses ^^
Lol ha non, je ne sais vraiment pas (il est vrai également que je n'ai jamais fait un HAVING de ma vie ...
Au vue de ta réponse, je n'ose même pas essayer ORDER BY DateExpedition LIMIT 5000 :mad: je vais attendre que tu es plus de temps lol
Hors ligne
Bon, cette fois c'est testé, histoire de ne pas te faire languir.
1) La précédente est bonne pour tous les enregistrements de ta table et pour des tris normaux du style "WHERE DateExpedition BETWEEN x AND y" ...
2) pour le faire sur les 5000 derniers enregistrements, dans le même contexte que la première requête que je t'ai donné la voici (elle fonctionne^^)
Bonne continuation
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bon, cette fois c'est testé, histoire de ne pas te faire languir.
1) La précédente est bonne pour tous les enregistrements de ta table et pour des tris normaux du style "WHERE DateExpedition BETWEEN x AND y" ...
2) pour le faire sur les 5000 derniers enregistrements, dans le même contexte que la première requête que je t'ai donné la voici (elle fonctionne^^)Bonne continuation
Poua ! une requête imbriquée (ci c'est comme ça que ça s'appel), ma hantise ! En tout cas elle fonctionne et je n'ai pas eu le temps de languir, ayant abandonné tout espoir de te voir revenir à la rescousse ! lol
Je pense qu'il faudrait que je m’intéresse à ce type de requête car je suis souvent obligé à faire plusieurs requête dans mes différents code.
Merci à toi c'est super !
Dernière modification par Anthotill (22-10-2011 09:01:31)
Hors ligne
Salut,
Ça aurait été avec plaisir pour la boîte de chocolat lol mais malheureusement j'ai un petit bug.
Nous avons reçu une livraison aujourd'hui, l'indice de stock est passé d'une valeur cohérente (~15 jours) à 114.12 jours (il y avait 23 produits avant et nous en avons reçu 128) !
Voici mon code :
[code: php]
<?php
require('include/connexion.php');
$SQL_MOY_ROTATION = "
SELECT AVG(UNIX_TIMESTAMP(t1.DateExpedition)-UNIX_TIMESTAMP(t1.DateReception))/86400 as Resultat
FROM (SELECT id, DateExpedition, DateReception
FROM gstock_produits
GROUP BY id
HAVING COUNT(id) <= 5000 AND DateExpedition != '0000-00-00 00:00:00'
ORDER BY DateReception DESC) as t1";
$REQ_MOY_ROTATION = mysql_query($SQL_MOY_ROTATION) or die('Erreur SQL !<br SELECT>'.$SQL_MOY_ROTATION.'<br>'.mysql_error());
mysql_close($db);
$ResultatMoyenne = mysql_fetch_assoc($REQ_MOY_ROTATION);
echo '',$ResultatMoyenneRound = round($ResultatMoyenne['Resultat'], 2),'';
?>[/code]
Est ce qu'il y a quelques choses que j'ai mal fait ou ?
Dernière modification par Anthotill (27-10-2011 07:29:47)
Hors ligne
Bonjour,
Je savais que j'allais te manquer...^^
Parmis les 128 produits reçus combien ont été réexpédiés? Quelle est la valeur dans la DB de "DateExpedition" pour ces produits (les non réexpédiés)? serait-elle de type NULL?
Dernière modification par Jc (27-10-2011 10:31:01)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Re,
D'ailleurs je viens de réaliser que ma question est inutile car si le résultat de ta requête a changé c'est que forcément tu as des dates d'expédition qui sont définies en NULL par défaut.
Outre le fait qu'il vaut 100 fois mieux de définir une date par défaut en '0000-00-00 00:00:00' qu'en NULL à partir du moment où elle est indéxée, je te laisse optimiser ta base comme tu l'entends.
Par contre voici la requête corrigée pour couvrir tous les cas de figure.
++
Dernière modification par Jc (27-10-2011 14:24:47)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Allez encore une p'tite optimisation pour la route (nan nan c'est pas pour le chocolat )
Dernière modification par Jc (27-10-2011 14:30:04)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Allez encore une p'tite optimisation pour la route (nan nan c'est pas pour le chocolat )
Merci pour ta réponse, avec la solution ci-dessous j'obtiens -3386 jours
Le champ DateExpedition est un datetime dont le default est 0000-00-00 00:00:00
Théoriquement, la valeur de Resultat ne doit pas être impactée par les DateExpedition qui ont comme valeur 000-00-00 00:00:00 puisqu'on les exclus de notre calcul.
La j'avoue que je ne sais pas quoi faire ni dire ....
Dernière modification par Anthotill (27-10-2011 14:52:25)
Hors ligne
Bonjour,
Vérifie comment tes enregistrements ont été enregistrés... comme par exemple l'enregistrement d'une date de reception dans une date d'expédition d'où le résultat négatif et la prise en compte desdits enregistrements..
Dernière modification par Jc (27-10-2011 15:00:34)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour,
Vérifie comment tes enregistrements ont été enregistrés... comme par exemple l'enregistrement d'une date de reception dans une date d'expédition d'où le résultat négatif et la prise en compte desdits enregistrements..
Bien vue, la dernière livraison comporte des dates de Réception à 0000-00-00 00:00:00 ! Il y en a même beaucoup plus que ce que je pensais (134 en tout) c'est de ma faute j'ai oublié de remettre le NOW() dans mon insertion !
Si je les exclus en faisant dans le HAVING : AND UNIX_TIMESTAMP(DateReception)>0 ça n'a pas d'effet sur le résultat ?
Dernière modification par Anthotill (27-10-2011 15:13:09)
Hors ligne
Bonjour,
Non il ne faut toucher à rien. Ta requête de production est la bonne donc on y touche pas.
Il te faut restaurer la cohérence de tes enregistrements.
On est à la limite du service commercial ^^
Si tu veux que j'intervienne sur ta base pas de soucis.
Sinon voici la méthode:
Il te faut agir directement dans ta base sur ton serveur ou via PHPmyAdmin et attention car il s'agit de données de production. Il te faudra donc intervenir uniquement sur les enregistrements corrompus, et par groupe de date. Tu réinitialises les dates d'expeditions, et tu remets à jour les bonnes dates de receptions sur les mêmes enregistrements.
N'intervient pas manuellement mais uniquement par requête en vérifiant les algos de ton process au préalable.
Par contre si tu te plantes et que tu n'as pas noté l'ordre de tes modifs et les requêtes exactes appliquées à ta base, je ne pourrais plus rien faire.
++
Dernière modification par Jc (27-10-2011 16:00:29)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Re,
Un conseil, au lieu de mettre un now() dans ta requête d'insertion, fait le dans ta définition de champ. Mets DateReception en TIMESTAMP et comme premier TIMESTAMP dans le schéma de ta table et en valeur par défaut mets CURRENT_TIMESTAMP.
Ensuite à l'insertion, soit tu ne cites pas le champs soit tu mets NULL, et si tu veux mettre une autre date que now() tu mets la valeur que tu veux dans la requête d'insert.
++
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne