Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/11/2010, 11h31   #1
Membre du Club
 
Homme
Développeur informatique
Inscription : avril 2009
Messages : 235
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 235
Points : 42
Points : 42
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 :
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
drake56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 11h38   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 629
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 629
Points : 2 615
Points : 2 615
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 ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 11h44   #3
Membre du Club
 
Homme
Développeur informatique
Inscription : avril 2009
Messages : 235
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 235
Points : 42
Points : 42
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
drake56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h16   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Puisque COURRIERTRAITE est un booléen, il peut s'additionner.
Essaie ceci :
Code :
1
2
3
4
5
6
7
SELECT 
    ROUND
    (
        SUM (COURRIERTRAITE) / COUNT(*)
    ) AS pourcentage
FROM dematcourrier.courrier
WHERE DATEDIFF(CURRENT_DATE, DATECOURRIER) <= 7
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/11/2010, 12h26   #5
Membre du Club
 
Homme
Développeur informatique
Inscription : avril 2009
Messages : 235
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 235
Points : 42
Points : 42
Ca fonctionne merci beaucoup !!!!
drake56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h44   #6
Membre du Club
 
Homme
Développeur informatique
Inscription : avril 2009
Messages : 235
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 235
Points : 42
Points : 42
Cependant, lorsque je veux faire la même chose mais pour la durée de traitement > 1 seconde via cette requête :

Code :
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
drake56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 13h18   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 629
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 629
Points : 2 615
Points : 2 615
là, essayez plutôt quelque chose comme ceci :

Code :
1
2
3
 
SELECT round(sum(case when(TEMPSTRAITEMENTCOURRIER > 1) then 1 else 0 end) / count(*) * 100) AS POURCENTAGE
FROM `dematcourrier`.COURRIER
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/11/2010, 13h24   #8
Membre du Club
 
Homme
Développeur informatique
Inscription : avril 2009
Messages : 235
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 235
Points : 42
Points : 42
Merci ça fonctionne parfaitement.
Peux-tu juste m'expliquer cette partie de la requête :
Code :
(sum(case when(TEMPSTRAITEMENTCOURRIER > 1) then 1 else 0 end)
drake56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 13h28   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
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.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/11/2010, 13h31   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 629
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 629
Points : 2 615
Points : 2 615
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
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/11/2010, 16h15   #11
Membre du Club
 
Homme
Développeur informatique
Inscription : avril 2009
Messages : 235
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2009
Messages : 235
Points : 42
Points : 42
Merci à vous deux pour vos explications.
Mon problème est maintenant totalement résolue.
Bonne fin de journée
drake56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h09.


 
 
 
 
Partenaires

Hébergement Web