Soustraction dans requête mysql

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 : Soustraction dans requête mysql

Re: Soustraction dans requête mysql

par maxredphenix » 05 oct. 2012, 22:29

Bon ça m'a pris au moins 10000 neurones tellement le cerveau à chauffé lol mais je pense que c'est bon, j'obtiens bien mes 3 heures:
$supp = mysql_query("DROP VIEW  nbreheure");
$reqcorrectif = mysql_query("CREATE VIEW nbreheure AS SELECT date_appel, d.id, idCorrectif, intervention_id, SUM(TIMESTAMPDIFF(SECOND,debut_inter,fin_inter)) AS travail, SUM(TIME_TO_SEC(tps_acces_signature)) AS acces
	FROM correctif AS c LEFT JOIN demande AS d ON c.id_appel = d.id LEFT JOIN work_times AS w ON intervention_id=c.id_appel
	WHERE MONTH(date_appel)=$mois AND YEAR(date_appel)=$annee AND debut_inter IS NOT NULL AND fin_inter IS NOT NULL AND type_inter = 'Correctif' AND statut='Cloturé' GROUP BY idCorrectif");
$correctif = mysql_query("SELECT idCorrectif,travail, acces,AVG (travail-acces) AS moyenne FROM nbreheure");
Qu'est ce que vous en pensez?

Re: Soustraction dans requête mysql

par maxredphenix » 05 oct. 2012, 21:48

En suivant le tuto et en réfléchissant un peu j'ai fait ceci pour le moment:
$reqcorrectif = mysql_query("CREATE VIEW nbreheure AS SELECT date_appel, d.id, idCorrectif, intervention_id, TIMESTAMPDIFF(SECOND,debut_inter,fin_inter) AS travail, TIME_TO_SEC(tps_acces_signature) AS acces
	FROM correctif AS c LEFT JOIN demande AS d ON c.id_appel = d.id LEFT JOIN work_times AS w ON intervention_id=c.id_appel
	WHERE MONTH(date_appel)=$mois AND YEAR(date_appel)=$annee AND debut_inter IS NOT NULL AND fin_inter IS NOT NULL AND type_inter = 'Correctif' AND statut='Cloturé'");
$correctif = mysql_query("SELECT AVG (travail-acces) AS moyenne FROM nbreheure");
Mais pour le moment j'ai un résultat de 1,5 heures alors qu'avec 6+3+1 je devrais avoir une moyenne (arrondi de 3 heures) donc je recherche toujours....

Re: Soustraction dans requête mysql

par maxredphenix » 05 oct. 2012, 20:26

Merci je connaissais pas les vues, si c'est comme les jointures ça commence à bien rentrer à force :)

J'ai trouvé ça on verra bien: http://www.apprendre-php.com/tutoriels/ ... -vues.html

Re: Soustraction dans requête mysql

par Mazarini » 05 oct. 2012, 11:41

Si j'ai bien compris alors la solution est dans l'utilisation d'une vue pour avoir les cumuls par demande.

A la base tu as une "table" (en fait résultat d'une jointure sans cumul/moyenne):
demande1,intervention1_1,temps1_1
demande1,intervention1_2,temps1_2
demande2,intervention2_1,temps2_1
Il est impossible de cumuler les ligne 1 et 2 et de faire une moyenne avec la ligne 3

Par contre tu peux faire une vue (CREATE VIEW DEMANDE_CUMULEE AS SELECT SUM()... GROUP BY DEMANDE) qui te fourni la même table que ci-dessus, mais avec des cumuls par demande.

Tu peux alors faire les moyenne avec la vue comme table.

(regardes la syntaxe exacte pour la création de vue, c'est simple mais je n'en fait pas tout les jours)

Re: Soustraction dans requête mysql

par maxredphenix » 05 oct. 2012, 11:27

Encore merci à tous les deux,

Je vais regarder ton exemple ce soir schim59. Sinon oui, tu as bien compris Mazarini, c'est vrai que c'est logique pour moi mais pas facile a expliquer :?

Merci

Re: Soustraction dans requête mysql

par schim59 » 05 oct. 2012, 08:36

Ce sujet aurait plus sa place en SQL

Re: Soustraction dans requête mysql

par Mazarini » 05 oct. 2012, 08:20

Bonjour,

si j'ai bien compris, tu veux cumuler le temp d'intervention par demande et faire une moyenne des temps d'intervention par demande. Ca ne me semble pas possible en une seul requête.

Il faut créer une vue des temps d'intervention par demande et faire un moyenne sur la vue.

Re: Soustraction dans requête mysql

par schim59 » 05 oct. 2012, 07:10

Voici la table pour mon exemple :

Image

Et la requête :
SELECT (
SUM( TIMESTAMPDIFF(
MINUTE , debut_inter, fin_inter ) ) + SUM( temps_acces )
) / COUNT( id ) AS total_inter
FROM test
A ajuster avec la clause WHERE, Puis une vue par type d'intervention plus une pour le globale comme dit ci dessous.

Re: Soustraction dans requête mysql

par maxredphenix » 04 oct. 2012, 20:59

Sans le AVG j'ai bien un résultat. Par rapport au données que j'ai rentré je devrais avoir 3 pannes:
1ere avec 6 heures d'intervention (4fiches)
2eme avec 1 heure (1 fiche)
3eme avec 3 heures (2 fiches)
soit .... 10 heures

Et sans le AVG je récupère 34200 dans la variable "moyenne", soit 34200/3600 : 9.5 heures. Après j'ai un round donc j'aurais bien mes 10 heures.

Mais du coup j'ai quand même un résultat potable, je vois pas pourquoi je peux pas rajouté ce fichu AVG pour avoir ma moyenne des 6, 1, 3 heures

Re: Soustraction dans requête mysql

par schim59 » 04 oct. 2012, 20:45

Sans le avg()?

Ou en créant une fonction?

Re: Soustraction dans requête mysql

par maxredphenix » 04 oct. 2012, 20:05

J'ai tenté ceci:
SELECT date_appel, d.id, idCorrectif, intervention_id, AVG(SUM((TIMESTAMPDIFF(SECOND,debut_inter,fin_inter)) - (TIME_TO_SEC(tps_acces_signature)))) AS moyenne
	FROM correctif AS c LEFT JOIN demande AS d ON c.id_appel = d.id LEFT JOIN work_times AS w ON intervention_id=c.id_appel
	WHERE MONTH(date_appel)=$mois AND YEAR(date_appel)=$annee  AND type_inter = 'Correctif' AND statut='Cloturé'
SELECT date_appel, d.id, idCorrectif, intervention_id, AVG((SUM(TIMESTAMPDIFF(SECOND,debut_inter,fin_inter))) - (SUM(TIME_TO_SEC(tps_acces_signature)))) AS moyenne
	FROM correctif AS c LEFT JOIN demande AS d ON c.id_appel = d.id LEFT JOIN work_times AS w ON intervention_id=c.id_appel
	WHERE MONTH(date_appel)=$mois AND YEAR(date_appel)=$annee AND type_inter = 'Correctif' AND statut='Cloturé'
J'ai beau chercher je vois pas, toujours la même erreur.

Re: Soustraction dans requête mysql

par schim59 » 04 oct. 2012, 19:49

peut etre en faisant avg(sum()), plutot que sum(avg())
Sinon je ne sais pas.

Re: Soustraction dans requête mysql

par maxredphenix » 04 oct. 2012, 19:21

J'ai regardé, le plus logique est de mettre le SUM comme dans ma précédente requête. Par contre en faisant ça j'ai une erreur de mysql:
invalid use of group function:
SELECT date_appel, d.id, idCorrectif, intervention_id, AVG((SUM(TIMESTAMPDIFF(SECOND,debut_inter,fin_inter))) - (SUM(TIME_TO_SEC(tps_acces_signature)))) AS moyenne
	FROM correctif AS c LEFT JOIN demande AS d ON c.id_appel = d.id LEFT JOIN work_times AS w ON intervention_id=c.id_appel
	WHERE MONTH(date_appel)=6 AND YEAR(date_appel)=2012 AND type_inter = 'Correctif' AND statut='Cloturé'
Ca me le fait seulement lorsque je rajoute le SUM. Sinon j'ai un peu modifié la requête parce que c'est plus logique de calculer la moyenne sur le temps total passé sur une panne qui est fini, j'ai aussi modifié la correspondance entre les id des 2 tables concernées pour prendre en compte toutes les fiches de chaque inter d'un mois donné.

Je vois pas pourquoi on ne peut pas cumulé AVG et SUM c'est bizarre

Re: Soustraction dans requête mysql

par maxredphenix » 04 oct. 2012, 10:32

Exacte j'ai oublié le SUM. Je regarderai ce que ça donne ce soir en rentrant chez moi.

Je te tiens au courant.

Merci

Re: Soustraction dans requête mysql

par schim59 » 04 oct. 2012, 06:39

Sauf erreur de ma part, il ne manque plus que la fonction SUM().
SELECT SUM(avg(TIMESTAMPDIFF(SECOND,debut_inter,fin_inter) - TIME_TO_SEC(tps_acces_signature))) AS total_duree_inter;
SInon pour alléger le code, il faudrait créer une autre table (duree_inter)et un trigger qui a chaque nouveau tupple calcul la durée et enrichit la table nouvellement crée.

la table :
Image
Pour le trigger, je te laisse t'amuser.

Ensuit on fait un simple
SELECT SUM(duree) FROM duree_inter