Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête sur plusieurs champs dans une même table

    27 août 2010 à 16:22:46

    Bonjour,

    J'ai une table MySQL comme cela :

    CREATE TABLE IF NOT EXISTS `suivi_demande` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `INE` char(11) NOT NULL,
    `decision_ancien` char(2) DEFAULT NULL,
    `decision_nouvelle` char(2) DEFAULT NULL,
    `date` date DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;


    Cette table me permet de suivre l'évolution du code "INE". Pour cela je stocke dans "decision_ancien" la valeur actuelle et dans "decision_nouvelle" la nouvelle valeur et je mets la date du jour dans "date". A chaque modification de la valeur "INE", j'ai une nouvelle ligne. Les évolutions des codes décision sont :

    A) 0 -> 10
    B) 10 -> 15

    Le nombre de possibilité est donc limité.

    Je souhaite connaitre le temps moyen de mise à jour de la valeur "INE". Pour cela je dois calculer pour chaque entrée la différence de date (decision_nouvelle - decision_ancien) et faire la moyenne de toutes les entrées.

    Pour le moment j'arrive à sélectionner la date A) :

    SELECT *
    FROM suivi_demande
    WHERE decision_ancien = 0 AND decision_nouvelle = 10


    La date B) :

    SELECT *
    FROM suivi_demande
    WHERE decision_ancien = 10 AND decision_nouvelle = 15


    C'est là ou je coince, je n'arrive pas à mixer les deux... Si quelqu'un pouvait m'aider...
    • Partager sur Facebook
    • Partager sur Twitter
      27 août 2010 à 19:07:43

      Salut,

      Si je comprends bien, pour chaque INE, on a une chaine de suivi_demande où le decision_nouvelle de l'un est le decision_ancien du suivant ?

      Si (et seulement si :-° ) la chaine est ininterrompue, tu peux associer un suivi_demande avec le suivi_demande suivant via une jointure :
      SELECT oldone.INE, oldone.date, newone.date
       FROM suivi_demande oldone 
       JOIN suivi_demande newone
            ON oldone.INE = newone.INE AND 
               oldone.decision_nouvelle = newone.decision_ancien
      


      Pour avoir les moyennes de chaque INE, il est possible de regrouper les lignes par INE et d'utiliser la fonction AVG qui calculera la moyenne (je suis pas sur de ce dernier point, c'est à tester :p ) :
      SELECT oldone.INE, AVG(newone.date - oldone.date) AS moyenne
       FROM suivi_demande oldone 
       JOIN suivi_demande newone
            ON oldone.INE = newone.INE AND 
               oldone.decision_nouvelle = newone.decision_ancien
       GROUP BY oldone.INE
      


      Si le AVG fonctionne pas avec une expression dedans, il faudra en passer par un calcul manuel avec des SUM et COUNT (pour avoir le nombre de changement de INE), en espérant que cela fonctionne avec des dates.
      • Partager sur Facebook
      • Partager sur Twitter

      "'But I don't want to go among mad people,' said Alice. 'Oh, you can't help that,' said the cat. 'We're all mad here.'" Lewis Carroll

        27 août 2010 à 19:49:55

        Je ne sais pas si la requête fonctionne, mais pour soustraire 2 dates il vaut mieux utiliser DATEDIFF(date1, date2) qui retourne le nombre de jours, où date1 et la date la plus grande, et date2 la date la plus petite (pour avoir un résultat positif).
        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2010 à 10:23:03

          Merci,

          Je teste les propositions et je vous tiens au courant !
          • Partager sur Facebook
          • Partager sur Twitter

          Requête sur plusieurs champs dans une même table

          × 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