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 de calcul de pourcentage


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut Problème de calcul de pourcentage
    Bonjour à tous,

    Je n'arrive pas à calculer un pourcentage en une seule requête qui sera utilisée sur MySQL.
    En fait, je souhaite récupéré le nombre total de courriers présents dans la base puis le nombre total de courriers traités en 1 semaine.
    J'ai fait cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ROUND( ( SELECT COUNT(*) AS TOTAL
                    FROM `dematcourrier`.`courrier` )
           / COUNT(*)) AS pourcentage ,
    FROM
           `dematcourrier`.`courrier`
    WHERE
         ( DATEDIFF(NOW(), DATECOURRIER) ) <= 7 AND
           COURRIERTRAITE = 1
    Hélas, ça ne fonctionne pas .
    Des suggestions pour m'aider ?

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    qu'est-ce que ca veux dire "ca fonctionne pas" ?

    si vous ne présentez pas votre erreur, ni un minimum sur vos tables / données ca ne va pas être facile.

    quelles sont les différentes valeurs de votre champ "COURRIERTRAITE" possible ?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    L'erreur est syntaxe invalide ou actuellement non supportée (la requête sera utilisée dans le logiciel BIRT pour pourvoir afficher un graphique dans mon rapport)
    Courriertraité est un booléen 1=vrai et 0=faux mais l'erreur vient du calcul au niveau du ROUND je pense.
    Merci

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Puisque COURRIERTRAITE est un booléen, il peut s'additionner.
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
        ROUND
        (
            SUM (COURRIERTRAITE) / COUNT(*)
        ) AS pourcentage
    FROM dematcourrier.courrier
    WHERE DATEDIFF(CURRENT_DATE, DATECOURRIER) <= 7

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Ca fonctionne merci beaucoup !!!!

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Cependant, lorsque je veux faire la même chose mais pour la durée de traitement > 1 seconde via cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ROUND(SUM(COURRIERTRAITE) / COUNT(*) * 100) AS POURCENTAGE
      FROM `dematcourrier`.COURRIER
      WHERE TEMPSTRAITEMENTCOURRIER > 1
    Il me sort 100% alors qu'il devrait me sortir 50%, comment ça se fait ?

    Merci

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    là, essayez plutôt quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select round(sum(case when(TEMPSTRAITEMENTCOURRIER > 1) then 1 else 0 end) / count(*) * 100) AS POURCENTAGE
    FROM `dematcourrier`.COURRIER

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Merci ça fonctionne parfaitement.
    Peux-tu juste m'expliquer cette partie de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sum(case when(TEMPSTRAITEMENTCOURRIER > 1) then 1 else 0 end)

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Il suffit de lire :
    CASE (dans le cas) WHEN (où) TEMPSTRAITEMENTCOURRIER > 1 (le temps de traitement du courrier est supérieur à 1) THEN (alors) 1 ELSE (sinon) 0.

    Et SUM additionne donc des 0 ou des 1.

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    En fait ca sert à simuler la solution du d'avant.
    Le "case" c'est une clause qui va faire une action ou une autre selon les conditions.

    Donc là on lui dit :
    - quand on a "TEMPSTRAITEMENTCOURRIER > 1" alors on prend la valeur 1
    - dans les autre cas on prend la valeur 0

    Puis on fait la somme de ces résultats

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 307
    Points : 87
    Points
    87
    Par défaut
    Merci à vous deux pour vos explications.
    Mon problème est maintenant totalement résolue.
    Bonne fin de journée

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

Discussions similaires

  1. VBA problème de référence absolue dans le calcul de pourcentages
    Par pétrin dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 29/08/2014, 17h27
  2. problème de calcul des normales par sommet
    Par captainSeb dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/01/2005, 13h42
  3. [Calendar]Problème de calcul de date
    Par valerie90 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/12/2004, 12h13
  4. Problème de calcul unix_timestamp
    Par petit_stagiaire dans le forum Administration
    Réponses: 2
    Dernier message: 28/04/2004, 15h27
  5. Calcul de pourcentage
    Par megazen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/11/2003, 16h43

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