Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1859 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb de calcul avec une requête SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb de calcul avec une requête SQL

n°1157040
rufo
Pas me confondre avec Lycos!
Posté le 22-07-2005 à 12:17:08  profilanswer
 

J'ai un pb pour écrire la ou les bonnes requêtes SQL (pour MySQl 3.23.x, donc pas de sous-requêtes :() me permettant de calculer le bon nombre de demandes clientes résiduelles (celles encore ouvertes).
 
Une demande cliente passe par un premier statut : "Soumise"
Ensuite, y'a forcément "Prise en compte", "En analyse".
Après on a le choix entre des statuts "Annulée", "En cours", "Traitée"..., revenir à "En analyse"...et boucler sur les autres statuts cité précédemment.
Et à la fin, on passe forcemément par le statut "Clos côté support" (fermeture de la demande par la hotline).
Enfin, si le client est d'accord, il clôture lui aussi via "Clos côté émetteur" (mais ça lui arrive souvent d'oublier) :D. Par contre, s'il n'est pas d'accord avec la réponse donnée, il peut réouvrir la demande : celle-ci revient alors à "Prise en compte" et c'est reparti pour un nouveau cycle.
 
Je précise que chaque changement de statut est daté (date et heure).
 
Pour calculer les demandes résiduelles en fin de chaque période (ça peut être les jours, les semaines, les mois ou les années), je compte le nb de demandes "Soumises" et "clos côté support" sur chaque période et je calcule la différence de manière incrémentale avec le nb de résiduelles de la période précédente.
ex : On imagine que mes demandes dans la bases commencent à partir de janvier 2005 (aucunes demandes soumises avant cette date).
Le nb de demandes résiduelles du mois de janvier est donc :  
RésidJan = Soumises en Jan - Clos support en Jan
 
Le nb de résiduelles de Février :  
RésidFev = RésidJan + Soumises en Fév - Clos support en Fév
 
Le nb de résiduelles de Mars :
RésidMars = RésidFév + Soumises en Mars - Clos support en Mars
etc.
 
Par ailleurs, une demande qui aurait 2 fois le statut "Soumise" ou "Clos côté support" sur la même période (ici le mois) n'est comptée qu'une fois
 
Mon pb survient quand j'ai des demandes qui sont cloturées durant un mois donné et réouvertes un autre mois puis clôturées à nouveau (durant le mois de réouverture ou un autre mois, peut importe là). :( De ce fait, la réouverture n'est pas compté comme une demande encore ouverte et au moment de la nouvelle clôture, je me retrouve faux d'une demande résiduelle puisqu'avec ma méthode de calcul, je compte 2 fois la clôture de la demande :sweat:...
 
Donc, est-ce-que l'un d'entre vous aurait une bonne méthode pour claculer les demandes résiduelles sachant que compter les demandes qui se trouvent dans un statut compris entre "Prise en compte" et celui situé avant "Clos côté support" ne marche pas dans la mesure où la périodicité de mise à jour des statuts d'une demande est plus longue que le mois (oui, une demande peut ne pas évoluer pendant plus d'1 mois :whistle:)...
 
Par avance, merci de votre aide. De mon côté, je regarde si c'est pas trop dure de calculer le nb de demandes réouvertes par période...

mood
Publicité
Posté le 22-07-2005 à 12:17:08  profilanswer
 

n°1157283
rufo
Pas me confondre avec Lycos!
Posté le 22-07-2005 à 15:09:42  profilanswer
 

pas très probant mon truc des demandes réouvertes. :(
 
En +, y'a le pb qu'une demande peut, après réouvertures, passer plusieurs fois dans le statut "prise en compte" si l'utilisateur a ajouté un commentaire...

n°1157378
mrbebert
Posté le 22-07-2005 à 16:09:16  profilanswer
 

Pas simple ton histoire ?[:gratgrat]
Et si tu fais :  
RésidFev = RésidJan + Soumises en Fév + Réouvertes en Fév - Clos support en Fév  [:figti]  
 
Ainsi, une demande pourrait être comptée plusieurs fois comme clôturée, mais aussi plusieurs fois comme (soumise ou réouverte) ?
 
Ou alors, faire le calcul sans tenir compte du rédiduel précédent
RésidFev = (Nombre d'ouverture <= fév) - (Nombre de Fermetures <= Fév)
 
Ce qui reste à faire à un instant T, c'est tout ce qui est arrivé (nouveau ou réouvert) avant T moins tout ce qui a été fermé avant T [:proy]

n°1158067
rufo
Pas me confondre avec Lycos!
Posté le 23-07-2005 à 21:30:05  profilanswer
 

mrbebert a écrit :

Pas simple ton histoire ?[:gratgrat]
Et si tu fais :  
RésidFev = RésidJan + Soumises en Fév + Réouvertes en Fév - Clos support en Fév  [:figti]  
 
Ainsi, une demande pourrait être comptée plusieurs fois comme clôturée, mais aussi plusieurs fois comme (soumise ou réouverte) ?
 
Ou alors, faire le calcul sans tenir compte du rédiduel précédent
RésidFev = (Nombre d'ouverture <= fév) - (Nombre de Fermetures <= Fév)
 
Ce qui reste à faire à un instant T, c'est tout ce qui est arrivé (nouveau ou réouvert) avant T moins tout ce qui a été fermé avant T [:proy]


 
Merci de ta proposition :)
La première : j'ai testé, ça marche pas en pratique car, pour l'instant, j'ai du mal à détecter la réouverture de manière unique pour une demande, comprendre qu'une réouverture = passage de "clos côté support" à "prise en compte", mais comme le cycle de vie est paramétrable, je peux pas coder en dur la détection de passage d'un ID de statut à un autre, donc je regarde si y a des ordres de statuts (1 à n) < à d'autres pour des ID d'entrées dans l'historique >. En effet, à chaque statut est associé un ordre pour savoir sa position dans le cycle de vie (ça permet de créer les statuts dans l'ordre que l'on veut, après, on les classe via leur n° d'ordre). Bon, tout ça pour dire que des fois, lors d'une réouverture, j'ai 2 statuts "prise en compte" qui se suivent sur des mois différents, ce qui fait que je vais compter 2 fois la réouverture de la demande :(
 
La 2ième : j'ai peur que je ne puisse écrire ce système de comptage avec 1 ou 2 requêtes SQL :(
 
Piste que je vais tester : exclure du comptage des clôtures les demandes réouvertes et les rajouter ensuite aux demandes clôturées en fonction des dates de clôtures des demandes réouvertes. Ca fait 2 requêtes SQL + un traitement en php sur les résultats...

n°1158097
mrbebert
Posté le 23-07-2005 à 22:54:19  profilanswer
 

rufo a écrit :

Merci de ta proposition :)
La première : j'ai testé, ça marche pas en pratique car, pour l'instant, j'ai du mal à détecter la réouverture de manière unique pour une demande, comprendre qu'une réouverture = passage de "clos côté support" à "prise en compte", mais comme le cycle de vie est paramétrable, je peux pas coder en dur la détection de passage d'un ID de statut à un autre, donc je regarde si y a des ordres de statuts (1 à n) < à d'autres pour des ID d'entrées dans l'historique >. En effet, à chaque statut est associé un ordre pour savoir sa position dans le cycle de vie (ça permet de créer les statuts dans l'ordre que l'on veut, après, on les classe via leur n° d'ordre). Bon, tout ça pour dire que des fois, lors d'une réouverture, j'ai 2 statuts "prise en compte" qui se suivent sur des mois différents, ce qui fait que je vais compter 2 fois la réouverture de la demande :(
 
...

Il est surement là, le problème. Comment compter quelque chose si tu n'arrives pas à identifier précisément cette chose ? [:proy]  
Je pense que la priorité, c'est de définir exactement comment une demande passe d'un état à l'autre [:figti]

n°1158371
rufo
Pas me confondre avec Lycos!
Posté le 24-07-2005 à 17:23:40  profilanswer
 

mrbebert a écrit :

Il est surement là, le problème. Comment compter quelque chose si tu n'arrives pas à identifier précisément cette chose ? [:proy]  
Je pense que la priorité, c'est de définir exactement comment une demande passe d'un état à l'autre [:figti]


 
c'est bien défini, mais c'est l'écriture de la requête qui n'est pas facile et qui pose problème :(... C'est pour ça que j'essaye de trouver une méthode de comptage valide et qui ne nécessite pas 36 requêtes sql compliquées ;)

n°1158821
rufo
Pas me confondre avec Lycos!
Posté le 25-07-2005 à 11:06:13  profilanswer
 

Voici un ex d'historique d'une demande réouverte :
 

Code :
  1. AowStatusHistoryID  AowStatusHistoryDate  AowID     AowStatusID 
  2. 25926               2004-11-30 16:21:50   3827        1 <- soumission
  3. 25928               2004-11-30 16:38:40   3827        1 <- soumission avec commentaire
  4. 26249               2004-12-02 16:18:52   3827        2
  5. 26897               2004-12-08 12:06:04   3827        3
  6. 26898               2004-12-08 12:06:12   3827        5
  7. 26900               2004-12-08 12:08:04   3827        8
  8. 28607               2004-12-23 11:37:49   3827       10 <- clôture support
  9. 28608               2004-12-23 11:38:00   3827        2 <- réouverture
  10. 28609               2004-12-23 11:38:33   3827        2 <- commentaire réouverture
  11. 28610               2004-12-23 11:38:59   3827        2 <- 2ième commentaire réouverture
  12. 28868               2005-01-03 14:25:01   3827        3
  13. 28870               2005-01-03 14:25:09   3827        5
  14. 28873               2005-01-03 14:26:41   3827        8
  15. 28874               2005-01-03 14:27:09   3827       10 <- clôture support
  16. 29670               2005-01-11 11:11:21   3827       11 <- clôture client


 
Si qq'un pouvait m'écrire la requête SQL pour Mysql qui permet de détecter le nb de demandes réouvertes par mois d'ouverture, ce serait sympa. Voilà ce que j'ai fait, moi :  

Code :
  1. SELECT COUNT(DISTINCT(a.AowID)) AS COUNTS,  DATE_FORMAT(h.AowStatusHistoryDate,'%Y-%m') AS YEARMONTH FROM Aow a, AowStatusHistory h, AowStatusHistory h2, AowStatus st, AowStatus st2 WHERE a.AowID = h.AowID AND h2.AowID = a.AowID AND h.AowStatusID = st.AowStatusID AND h2.AowStatusID = st2.AowStatusID AND st.AowStatusOrder < st2.AowStatusOrder AND h.AowStatusHistoryID > h2.AowStatusHistoryID AND st2.AowStatusOrder = 11 AND DATE_FORMAT(h.AowStatusHistoryDate,'%Y-%m-%d') BETWEEN '2003-01-30' AND '2005-06-30' GROUP BY YEARMONTH


 
Donc, si qq'un peut améliorer ma requête pour que je ne compte plus les statuts 2, 2, 2, 3, 5, 8 qui suivent la première clôture support, je l'en remercierais :jap:

n°1158911
rufo
Pas me confondre avec Lycos!
Posté le 25-07-2005 à 11:54:31  profilanswer
 

J'ai essayé une autre méthode :  
nb de soumises dans le mois - nb de clôtures dans le mois sans compter les demande réouvertes - nb de clôtures dans le mois des demandes réouvertes.
 
Ben ça marche pas :( Je commence à être à cours d'idées car je vois pas d'où vient mon pb...

n°1159080
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-07-2005 à 15:02:13  profilanswer
 

Ca me paraît pas gagné ton truc.
 
Vais tenter une tambouille dans mon coin, mais sans sous-requête, je pense que ça va être tout bonnement impossible à maintenir... :/

n°1159086
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-07-2005 à 15:07:13  profilanswer
 

C'est quoi le "AowID" ? C'est le numéro de demande ?
 
Alors pourquoi on ouvre deux-fois la même ?

Code :
  1. 25926               2004-11-30 16:21:50   3827        1 <- soumission
  2. 25928               2004-11-30 16:38:40   3827        1 <- soumission avec commentaire

mood
Publicité
Posté le 25-07-2005 à 15:07:13  profilanswer
 

n°1159088
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-07-2005 à 15:08:06  profilanswer
 

Je pense que déjà, là, y'a un truc qui cloche. Parceque là, on ne peux pas savoir s'il n'y a qu'une ouverture ou une ouverture puis une réouverture.
 
Ensuite, à la réouverture, on passe à 2 plutôt que 1 (soit). Et idem, on a plusieurs fois le status 2.
 
Là, clairement, y'a un souci je pense.


Message édité par Arjuna le 25-07-2005 à 15:09:07
n°1159169
rufo
Pas me confondre avec Lycos!
Posté le 25-07-2005 à 16:14:25  profilanswer
 

Le AowID, c'est l'ID d'une demande.
 
Le fait qu'il y ait 2 fois le statut 1 "soumise" ne signifie pas qu'il y a 2 soumission pour la même demande. J'ai viré certains champs (dont le commentaire). Le premier 1 indique la création de la demande, le 2ième 1 contient un commentaire de la part de celui qui affecte la demande à un responsable. Quand le responsable affecté ouvre la demande, elle passe au statut 2. Il peut alors tracer dans l'historique un commentaire, d'où un éventuel 2ième statut 2... Quand y'a une réouverture, on ne repasse pas par le statut 1 mais par le statut 2. Là encore, le resposnable peut tracer un commentaire.
En fait une soumission ou une réouverture est détectée par le passage d'un statut à un autre : soumission -> aucun statut à statut 1, réouverture -> statut 10 à statut 2.
 
Voilà. J'ai été plus clair, là?

n°1159170
rufo
Pas me confondre avec Lycos!
Posté le 25-07-2005 à 16:14:54  profilanswer
 

ps: au fait, merci de ton aide :)

n°1159194
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-07-2005 à 16:36:56  profilanswer
 

ok, donc il faut prendre les aowid = 1 et 2 où commentaire= NULL c'est bien ça ? c'est une règle respectée à coup sûr ou non ?

n°1159195
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-07-2005 à 16:37:20  profilanswer
 

en fait,il faut pouvoir isoler les lignes où on fait réellement l'action d'ouvrir ou réouvrir.

n°1159805
rufo
Pas me confondre avec Lycos!
Posté le 26-07-2005 à 10:01:28  profilanswer
 

Arjuna a écrit :

en fait,il faut pouvoir isoler les lignes où on fait réellement l'action d'ouvrir ou réouvrir.


 
Pour la soumission, effectivement, le commentaire est à NULL. Pour la réouverture par contre, c'est mois sûr. En pratique, y'a rarement un commentaire mais ça peut arriver...

n°1159810
Arjuna
Aircraft Ident.: F-MBSD
Posté le 26-07-2005 à 10:09:55  profilanswer
 

Ben faut une ligne à NULL, ou un flag quelque part qui permette d'isoler la ligne, sinon on ne peux pas exploiter les données...

n°1160199
rufo
Pas me confondre avec Lycos!
Posté le 26-07-2005 à 13:50:38  profilanswer
 

Arjuna a écrit :

Ben faut une ligne à NULL, ou un flag quelque part qui permette d'isoler la ligne, sinon on ne peux pas exploiter les données...


 
Ben si, en détectant un front (passage d'un statut à une autre). Réouverture = passage de 10 à 2. Si après on a un autre 2, le front est 2 -> 2, c'est donc pas une réouverture.

n°1160292
Arjuna
Aircraft Ident.: F-MBSD
Posté le 26-07-2005 à 14:36:06  profilanswer
 

ouais mais là, en une passe, franchement, je la sens pas du tout (mais alors pas du tout :D)

n°1161109
rufo
Pas me confondre avec Lycos!
Posté le 27-07-2005 à 09:49:43  profilanswer
 

Arjuna a écrit :

ouais mais là, en une passe, franchement, je la sens pas du tout (mais alors pas du tout :D)


 
alors en 2 requêtes peut-être?

n°1161111
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 09:52:39  profilanswer
 

ben... c'est surtout que tu vas devoir passer par une boucle, c'est ça que je crainds...
 
vais quand même faire un ou deux tests avant, mais à mon avis c'est sans espoir

n°1161112
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 09:53:35  profilanswer
 

a mon avis, tu devrais surtout te concertrer sur une modif de l'appli pour séparrer les "fronts" comme tu dis, plutôt que devoir le faire en interprétant plusieurs lignes. C'est là que ça coince

n°1161326
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 11:56:08  profilanswer
 

Bon, je viens de regarder en vitesse, et je trouve une solution passant par une table temporaire.
 
C'est bien ça que tu veux ? :
 
"la liste de toutes les demandes encore ouvertes"
 
Si c'est le cas, moyennant petites modifications, ce lot de requête fonctionne et évite de faire une boucle.
 

Code :
  1. select AowID, max(AowStatusHistoryID) AowStatusHistoryID
  2. into #tmp
  3. from dde
  4. where aowstatusid >= 10
  5. group by AowID
  6. select distinct dde.aowid
  7. from #tmp, dde
  8. where dde.AowStatusHistoryID > #tmp.AowStatusHistoryID
  9. and dde.aowid = #tmp.aowid
  10. drop table #tmp


Message édité par Arjuna le 27-07-2005 à 11:57:53
n°1162019
rufo
Pas me confondre avec Lycos!
Posté le 27-07-2005 à 17:55:17  profilanswer
 

Arjuna a écrit :

Bon, je viens de regarder en vitesse, et je trouve une solution passant par une table temporaire.
 
C'est bien ça que tu veux ? :
 
"la liste de toutes les demandes encore ouvertes"
 
Si c'est le cas, moyennant petites modifications, ce lot de requête fonctionne et évite de faire une boucle.
 

Code :
  1. select AowID, max(AowStatusHistoryID) AowStatusHistoryID
  2. into #tmp
  3. from dde
  4. where aowstatusid >= 10
  5. group by AowID
  6. select distinct dde.aowid
  7. from #tmp, dde
  8. where dde.AowStatusHistoryID > #tmp.AowStatusHistoryID
  9. and dde.aowid = #tmp.aowid
  10. drop table #tmp



 
Je vais être chiant mais bon  :whistle:  
Ta requête, ça donne les demandes actuellement ouvertes... C'est exactement ce genre de requête que j'ai fait pour mon moteur de recherche pour connaître le statut courant d'une demande... Pour rappelle, il me fait les demandes qui étaient ouvertes ou fermées pour chaque mois. A la limite, on pourrait lancer ces 2 requêtes sur chaque mois en limitant la de l'historique de chaque demande, mais ça va être long comme traitement :(...

n°1162024
rufo
Pas me confondre avec Lycos!
Posté le 27-07-2005 à 17:57:33  profilanswer
 

et puis modiffier l'appli, vu qu'il y a 6000 demandes (plus de 45000 entrées dans la table des historiques des demandes), ça va pas être possible :(
 
Je crois que je vais laisser comme c'est. J'ai un petit différent (8 sur 110)...

n°1162038
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 18:11:03  profilanswer
 

Bon, là je rentre chez moi, je verrai ça demain.
 
A mon avis, c'est tout bête de faire cette requête pour chaque mois.
 
Sinon, modifier l'appli, si, tu peux le faire. Au pire, durant les premiers mois, à cause de l'historique qui n'a pas été mis à jour, tu ne pourras pas utiliser les nouvelles données, mais au bout de mettons 6 mois, je doute que ce soit très intéressant de retrouver les demandes ouvertes depuis une aussi longue période, donc tu pourras activer la nouvelle requête qui marche mieu :)

n°1162039
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2005 à 18:11:24  profilanswer
 

Ceci dit, finalement, je ne sais pas si c'est très utile, donc laisse tomber :)

n°1162076
rufo
Pas me confondre avec Lycos!
Posté le 27-07-2005 à 18:49:37  profilanswer
 

Arjuna a écrit :

Ceci dit, finalement, je ne sais pas si c'est très utile, donc laisse tomber :)


 
en tout cas, merci pour ton aide :jap:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb de calcul avec une requête SQL

 

Sujets relatifs
[Résolu] Condition+SQL[SQL]fonction de comparaison de chaines
SGBD / ASP : Page tester des procédures stockées SQL Server depuis ASPrequete group by ?
[Access] Requête à partir d'une zone de texte (Résolu)[ SQL ] Regrouper et sommer plusieurs lignes selon critères
problème récupération de donnée après une requete[ resolu - sql help ] requete sql not in
prob comptage enregistrements SQL[SQL]trigger simple avant insertion
Plus de sujets relatifs à : Pb de calcul avec une requête SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR