Partage
  • Partager sur Facebook
  • Partager sur Twitter

requête moyenne calculé filtré

Sujet résolu
    25 janvier 2020 à 16:23:58

    Bonjour a tous,

    1)

    je cherche a faire une requête qui calcule la moyenne de temps passé entre deux colonnes (heure_traitement & heure_demande) filtré par personne et par période.

    Je tourne en rond... Merci de votre aide.

    ma table :

    technicien - heure_demande - heure_traitement

    ma requête qui est accepté mais elle me retourne pas le bon résultat :

    SELECT DISTINCT 
    
        T.technicien, 
    
        T1.nombre as annee_N1, 
    
        T2.nombre as annee_N 
    
    FROM 
    
        `10` T 
    
            LEFT JOIN (
    
                    SELECT `technicien`, AVG(TIME_TO_SEC((DATEDIFF( heure_traitement, heure_demande )))) AS nombre 
    
                    FROM `10` 
    
                    WHERE `heure_demande` >= '2019-01-01 00:00:00' and `heure_demande` <= '2019-12-31 23:59:59' 
    
                    GROUP BY technicien 
    
                ) T1 
    
                ON T.technicien = T1.technicien 
    
            LEFT JOIN (
    
                    SELECT `technicien`, AVG(TIME_TO_SEC((DATEDIFF( heure_traitement, heure_demande )))) AS nombre 
    
                    FROM `10` 
    
                    WHERE `heure_demande` >= '2020-01-01 00:00:00' and `heure_demande` <= '2020-12-31 23:59:59' 
    
                    GROUP BY technicien 
    
                ) T2 
    
                ON T.technicien = T2.technicien

    2)

    deuxieme requete basé sur la meme table , qui doit me calculer le nombre de ligne par mois suivant deux periode défini.

    ma requète :

    SELECT DISTINCT 
        T.mois,
        T1.nombre as annee_N1,
        T2.nombre as annee_N 
        FROM 
        	`10` T 
            LEFT JOIN (
                SELECT MONTH(heure_demande)as mois, COUNT(*) AS nombre FROM `10` WHERE `heure_demande` >= '2019-01-01 00:00:00' and `heure_demande` <= '2019-12-31 23:59:59' GROUP BY mois asc ) T1 
                ON T.mois = T1.mois 
             LEFT JOIN (
                SELECT MONTH(heure_demande)as mois, COUNT(*) AS nombre FROM `10` WHERE `heure_demande` >= '2020-01-01 00:00:00' and `heure_demande` <= '2020-12-31 23:59:59' GROUP BY mois asc ) T2 
                ON T.mois = T2.mois

    elle me fait une erreur mysql:

    #1054 - Unknown column 'T.mois' in 'field list'


    J'ai besoin d'un œil extérieur, pour me remettre sur le bon chemin.

    bonne journée !

    Stéphane.

    -
    Edité par StefAlsace 26 janvier 2020 à 10:09:48

    • Partager sur Facebook
    • Partager sur Twitter
      26 janvier 2020 à 12:14:33

      Bonjour,

      AVG( heure2 - heure1 ) ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        26 janvier 2020 à 19:01:38

        Bonjour,

        pour le problème 1

        je suis en format datetime, donc je presume qu'il faut faire un calcul de soustraction datediff et mettre le résultat en seconde pour finir par une moyenne . En faite je sais pas si je m'y prend bien...

        soustraire directement deux dates ( heure2-heure) sa me donne complement autre chose. Pourrais-tu m'expliquer svp ?

        Problème 2 :

        une idée ?

        merci d'avance

        • Partager sur Facebook
        • Partager sur Twitter
          27 janvier 2020 à 10:06:50

          Pour ta deuxième question, l'erreur est suffisamment claire non ... Dans la table aliasée T, la colonne mois n'existe pas ... Et c'est normal puisque le mois est calculé avec la fonction MONTH y compris dans les sous requêtes T1 et T2 ...

          SELECT DISTINCT
          	MONTH( T.heure_demande ),
          	T1.nombre as annee_N1,
          	T2.nombre as annee_N
          	FROM
          		`10` T
          		LEFT JOIN (
          				SELECT MONTH(heure_demande)as mois, COUNT(*) AS nombre
          				FROM `10`
          				WHERE `heure_demande` >= '2019-01-01 00:00:00' and `heure_demande` <= '2019-12-31 23:59:59'
          				GROUP BY mois
          			) T1
          			ON MONTH( T.heure_demande ) = T1.mois
          		 LEFT JOIN (
          				SELECT MONTH(heure_demande)as mois, COUNT(*) AS nombre
          				FROM `10`
          				WHERE `heure_demande` >= '2020-01-01 00:00:00' and `heure_demande` <= '2020-12-31 23:59:59'
          				GROUP BY mois
          			) T2
          			ON MONTH( T.heure_demande ) = T2.mois

          Et pas besoin de ASC dans le GROUP BY ...

          Après c'est dommage de faire des sous-requête ici et un peu absurde, tu pourrais simplement regrouper année ...

          Personnellement je ferais ainsi :

          SELECT
          	YEAR( T.heure_demande ),
          	MONTH( T.heure_demande ),
          	COUNT( * ) AS nombre
          FROM `10` T
          WHERE
          	`heure_demande` >= '2019-01-01 00:00:00'
          	and `heure_demande` <= '2020-12-31 23:59:59'
          GROUP BY
          	YEAR( T.heure_demande ),
          	MONTH( T.heure_demande )

          Après c'est toi de voir ...

          Du coup, cela permet aussi de simplifier ta première requête, où tu n'étais pas loin selon moi ...

          SELECT
          	YEAR( T.heure_demande ),
          	MONTH( T.heure_demande ),
          	COUNT( * ) AS nombre,
          	SEC_TO_TIME( AVG( TIME_TO_SEC(  TIMEDIFF( post_modified, post_date ) ) ) ) AS duree
          FROM `10` T
          WHERE
          	`heure_demande` >= '2019-01-01 00:00:00'
          	and `heure_demande` <= '2020-12-31 23:59:59'
          GROUP BY
          	YEAR( T.heure_demande ),
          	MONTH( T.heure_demande )

          Juste quelques explications sur la moyenne :

          SEC_TO_TIME( AVG( TIME_TO_SEC(  TIMEDIFF( post_modified, post_date ) ) ) )

          On commence par soustraire les heures entre les deux dates (TIMEDIFF), puis on converti ces heures en secondes (TIME_TO_SEC), on fait la moyenne de ces secondes (AVG) et on repasse cela en heure (SEC_TO_TIME).

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            27 janvier 2020 à 18:20:53

            Juste parfait comme réponse !

            Merci beaucoup.

            Pour le problème 1 , ah oui j'étais pas loin mais j'ai pas lu assez chaque fonction , effectivement quand c'est expliqué ça coule de source :-)

            Pour le problème 2 , là j'étais persuadé qu'il reprenais "mois" en colonne alors que "mois" était les valeurs retournée dans "nombre" si je comprend bien.

            Je suis resté sur ma façon de faire bien que la tienne soit plus compact et ne nécessite qu'une requête. Pour mon traitement php après je m'en sort mieux d'avoir deux résultat distinct et 1 colonne par technicien / annéeN / annéeN1.

            En tout ça merci beaucoup du temps passé sur mes deux problèmes.

            • Partager sur Facebook
            • Partager sur Twitter

            requête moyenne calculé filtré

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown