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 :

SELECT imbriqué pour calcul d'un taux


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 33
    Points
    33
    Par défaut SELECT imbriqué pour calcul d'un taux
    Bonjour,

    J'ai une table nommée projet avec les champs suivants :

    id, date_mission, date_cloture, etat_mission

    Je voulais mettre un graphe pour l'indicateur suivant : taux de validation des projet par mois (ça veut dire le nombre de projet validé par mois sur le nombre total de projet toujours par mois).

    NB : etat_mission peut prendre les valeurs suivantes : encours ou bien Clôturée

    pour faire, je met la requette sql suivant pour un sqldatasource :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ( (SELECT COUNT(id) FROM [projet] WHERE etat_mission = 'Clôturée') / COUNT(id) ) as taux, month(date_mission) as mois FROM [projet] GROUP BY month(date_mission)
    La requette semble etre correcte mais le resultat est erroné vu que le premier tronçon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT COUNT(id) FROM [projet] WHERE etat_mission = 'Clôturée')
    me retourne le nombre d'enregistrement ayant un etat_mission=Clôturée en global et non pas par mois.

    ca veut dire que le GROUP BY à la fin n'agit pas sur la premiere requette à l'interieur.

    Ma demande peut se traduire par :
    Comment rendre le GROUP BY en influence sur la requette au milieu. ou bien comment mettre en place une variable qui peut communiquer entre les deux select imbriqués.


    Merci pour votre help.

  2. #2
    Membre confirmé
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Points : 542
    Points
    542
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT
    month(date_mission) AS mois
    COUNT(*) / (SELECT COUNT(id) FROM [projet])
    FROM [projet]
    WHERE etat_mission = 'Clôturée'
    GROUP BY month(date_mission)
    Peut être ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Bonjour et merci pour la réponse.

    Le problème est que pour la ligne en gras souligné retourne l'ensemble des enregistrements (alors que j'ai besoin des enregistrements par mois conformement au GROUP BY)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    month(date_mission) AS mois
    COUNT(*) / (SELECT COUNT(id) FROM [projet])
    FROM [projet]
    WHERE etat_mission = 'Clôturée'
    GROUP BY month(date_mission)
    NB : COUNT(*) est par mois alors que le select est total
    Merci bien

  4. #4
    Membre confirmé
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Points : 542
    Points
    542
    Par défaut
    Et en ajoutant une clause WHERE pour juste ressortir le nombre de projets par mois ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    month(A.date_mission) AS mois
    COUNT(*) / (SELECT COUNT(id) FROM [projet] where month(date_mission) = A.date_mission)
    FROM [projet] A
    WHERE A.etat_mission = 'Clôturée'
    GROUP BY month(A.date_mission)
    Je ne fais que des suppositions je ne sais pas si ça va marcher :p

  5. #5
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par Bibeleuh Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    month(A.date_mission) AS mois
    COUNT(*) / (SELECT COUNT(id) FROM [projet] where month(date_mission) = A.date_mission)
    FROM [projet] A
    WHERE A.etat_mission = 'Clôturée'
    GROUP BY month(A.date_mission)
    non ça ne fonctionne pas et (il manque une virgule aprés le AS MOIS à l'origine)
    je suppose aussi que tu es en MSSQL?
    sinon, à partir d'uin jeu de données simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    create table test (a datetime, b numeric);
    insert into test values ('01-01-2012 00:00:00',1);
    insert into test values ('08/01/2012',2);
    insert into test values ('02/01/2012',3);
    insert into test values ('02/02/2012',4);
    insert into test values ('01/02/2012',5);
     
    select * from test;
     
    SELECT 
    month(a) AS mois,
    COUNT(month(a)) as nb_enrg_par_mois
    FROM [test] t
    GROUP BY month(a);
    rés :
    mois nb_enrg_par_mois
    1 2
    2 2
    8 1

    ps : la clause "cloturée" peut avoir néanmoins son importance, mais j'attend ton retour ...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 817
    Points
    17 817
    Par défaut
    Essayez quelque chose de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT month(date_mission) AS mois
           , count(case etat_mission when 'Clôturée' then 1 end) / count(*)
        FROM [projet]
    GROUP BY month(date_mission)
    Attention aux années et aux arrondis de la division.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Merci pour vos réponse.
    C'est bien résolu avec les deux propositions.

    Amicalement

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

Discussions similaires

  1. Numéro du mois pour calcul d'un taux de rendement
    Par Superhandz dans le forum Deski
    Réponses: 17
    Dernier message: 08/07/2011, 14h34
  2. Macro pour calcul de taux d'incidence
    Par Impactin dans le forum Macro
    Réponses: 0
    Dernier message: 16/06/2010, 12h49
  3. SYBASE SELECT imbriqué clause FROM
    Par Nicolas Martel dans le forum Sybase
    Réponses: 2
    Dernier message: 19/11/2003, 15h28
  4. Réponses: 2
    Dernier message: 01/04/2003, 22h09

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