IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Problème SUBSTR-CAST-AVG valeur NULL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Problème SUBSTR-CAST-AVG valeur NULL
    Bonjour tout le monde !

    Mon problème d'aujourd'hui résulte dans l'imbrication de plusieurs fonctions. Ces fonctions imbriquées fonctionnent très bien dans ma requête mais cependant (fallait s'y attendre...) certains résultats sortent 'NULL'.

    SGBD : MySQL

    Bon je vous donne les détails de mes tables :

    -- Structure de la table `dureejob`

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE IF NOT EXISTS `dureejob` (
      `idDureeJob` int(11) NOT NULL auto_increment,
      `Traitement_idTraitement` int(10) NOT NULL,
      `Job_idJob` int(11) NOT NULL,
      `Debut` datetime default NULL,
      `Fin` datetime default NULL,
      `Temp` time default NULL,
      PRIMARY KEY  (`idDureeJob`),
      KEY `DureeJob_FKIndex1` (`Job_idJob`),
      KEY `DureeJob_FKIndex2` (`Traitement_idTraitement`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8103 ;
    -- Structure de la table `job`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE IF NOT EXISTS `job` (
      `idJob` int(11) NOT NULL auto_increment,
      `Jobset_idJobset` int(11) NOT NULL,
      `NomJob` varchar(30) default NULL,
      `Description` varchar(200) default NULL,
      PRIMARY KEY  (`idJob`),
      KEY `Job_FKIndex1` (`Jobset_idJobset`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12918 ;
    -- Ma requête qui fonctionne (ou plutôt qui m'affiche des résultats) !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
          COUNT(Job_idJob),
          Job.idJob,
          Job.NomJob,
          SUBSTR(Debut,1,7),
          SUBSTR(cast(Avg(Temp) AS TIME),1,8)
    FROM DureeJob INNER JOIN Job ON DureeJob.Job_idJob=Job.idJob AND job.nomjob LIKE '%-%D-%'
    GROUP BY 
          SUBSTR(DEBUT,1,7),
          job_idjob 
    ORDER BY SUBSTR(Debut,1,10) ASC
    -- Explication de la requête :

    SELECT
    1. Compte du nombre de Jobs similaires composants la moyenne
    2. ID du groupe de Job (Jobs composants la moyenne donc ayant le même ID)
    3. Debut est à la base un champ DATETIME, je sélectionne que le XXXX-XX
    4. Temp étant un champ de type TIME et voulant faire des moyenne j'écarte les ',XXXX' pour que je ne puisse pas avoir de TIME XX:XX:XX,XXXXX

    FROM
    DureeJob --> Job sur DureeJob.Job_idJob=Job.idjob
    Et je sélectionne uniquement les Jobs contenant la lettre D à un certain endroit du mot

    But de la requête :

    Ce que j'attends de cette requête est simple, faire la moyenne du champ 'Temp' (sous la forme XX:XX:XX) des Jobs de même ID par Année-Mois, contenant la lettre D (à une certaine position) en faisant apparaitre le nombre de Jobs qui composent la moyenne, l'ID du groupe de même Jobs et leurs Noms (Même IDs --> Même Noms)

    Extrait du résultat de la requête :

    COUNT(Job_idJob) idJob NomJob SUBSTR(Debut,1,7) SUBSTR(cast(Avg(Temp) AS TIME),1,8)
    2 6875 PRRCI-009D-050D 2009-07 NULL
    9 11312 POXYZ-912D-010D 2009-06 NULL
    1 12750 PRTLZ-TSTD-015D 2009-07 00:00:00
    1 11518 PREPF-100D-265D 2009-06 00:00:00
    1 11191 PICVZ-TSTD-005D 2009-06 00:00:00
    1 11462 PREJZ-TSTD-020D 2009-06 00:00:00
    Alors on voit qu'il y a des moyennes à 00:00:00 (normal ce sont des jobs qui ont pris moins d'une seconde à s'exécuter) et des groupes de Jobs NULL.
    Ce qu'il faut savoir c'est que parmi ces groupes, aucun des jobs qui les composent sont de valeurs NULL.
    Autre Piste, la ligne
    9 11312 POXYZ-912D-010D 2009-06 NULL
    à une petite sœur :
    1 11312 POXYZ-912D-010D 2009-07 00:00:00
    Cependant, quand je les regroupent (je ne les tris plus par Années/Mois), le résultat NULL n'apparait plus et cela donne une ligne de style :
    10 11312 POXYZ-912D-010D 2009 00:34:00
    Pour précision : quand dans ma requête je ne CAST plus en TIME, le résultat n'est plus NULL et cela donne :

    Requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
          COUNT(Job_idJob),
          Job.idJob,
          Job.NomJob,
          SUBSTR(Debut,1,7),
          Avg(Temp)
    FROM DureeJob INNER JOIN Job ON DureeJob.Job_idJob=Job.idJob AND job.nomjob LIKE '%-%D-%'
    GROUP BY 
          SUBSTR(DEBUT,1,7),
          job_idjob ORDER BY COUNT(Job_idJob)  DESC
    Résultat :
    COUNT(Job_idJob) Décroissant idJob NomJob SUBSTR(Debut,1,7) Avg(Temp)
    9 11312 POXYZ-912D-010D 2009-06 61.8888888888889
    7 1678 PDACI-TSTD-060D 2009-07 4
    7 1681 PDACI-TSTD-090D 2009-07 2.57142857142857
    7 1677 PDACI-TSTD-050D 2009-07 3.85714285714286
    A noter qu'il n'y a plus aucun résultats en 'NULL' mais que le résultat de la première ligne est à 61,8. Je me demande donc si le NULL ne viens pas de l'incompatibilité de 61,8 minutes dans un format TIME ??

    Si quelqu'un voit une solution à mon problème ça serait Top Moumoute !

    Merci d'avance à tout le monde !

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Alors j'ai trouver mon problème et pour ceux que ça intéresse voici ma nouvelle requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
          COUNT(Job_idJob),
          Job.idJob,
          Job.NomJob,
          SUBSTR(Debut,1,7),
          SEC_TO_TIME(Avg(TIME_TO_SEC(Temp)))
    FROM DureeJob INNER JOIN Job ON DureeJob.Job_idJob=Job.idJob AND job.nomjob LIKE '%-%D-%'
    GROUP BY 
          SUBSTR(DEBUT,1,7),
          job_idjob 
    ORDER BY SUBSTR(Debut,1,10) ASC
    En gros, je fais la conversion de mon champ TIME en secondes, je fais la moyenne de ces secondes et par la suite, je les reconvertis en TIME donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SEC_TO_TIME(Avg(TIME_TO_SEC(Temp)))
    Voili voilo !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème bizarre, requête et valeur null
    Par AsmCode dans le forum IHM
    Réponses: 4
    Dernier message: 15/11/2009, 18h43
  2. [MySQL] problème update champ float valeur null
    Par dubitoph dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/02/2009, 12h42
  3. Problème champs calculés et valeur null
    Par markintell dans le forum Access
    Réponses: 18
    Dernier message: 10/01/2006, 19h14
  4. Problème de valeur nulle
    Par romulus34 dans le forum Access
    Réponses: 11
    Dernier message: 21/10/2005, 16h18
  5. Problème de valeur null dans un recordset
    Par Petzouille57 dans le forum Access
    Réponses: 3
    Dernier message: 19/05/2005, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo