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 :

Besoin d'aide pour une requête SQL


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Besoin d'aide pour une requête SQL
    Bonjour à tous,

    Voila j'ai un petit souci pour réunir deux requêtes :

    Voici celle de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT P.ID_PROJET, P.ID_CLIENT, P.ID_COLLABORATEUR, P.ID_ADRESSE_POSTALE, P.CODE_SECTEUR, P.NOM_PROJET, P.DESCRIPTION, P.ID_LAST_USER, P.STIMESTAMP, P.ACTIF 
    FROM projet P 
    left join mission M on (P.ID_PROJET = M.ID_PROJET)
    left join collaborateur C on (C.ID_COLLABORATEUR = M.ID_COLLABORATEUR)  
    WHERE 1 = 1  
    GROUP BY P.ID_PROJET 
    ORDER BY P.NOM_PROJET
    Elle permet d'avoir toute la liste des projets.
    Maintenant je veux rajouter une colonne qui compte le nombre de mission en cours (donc avec une date du jour comprise entre la date de début et la date de fin)

    voici la requête seule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ID_PROJET, count(ID_MISSION) as nombre 
    FROM mission 
    WHERE NOW() BETWEEN DATE_DEB_MISSION and DATE_FIN_MISSION 
    GROUP BY ID_PROJET 
    ORDER BY ID_PROJET
    Comme vous le voyez, c'est les mêmes tables.
    Ce que je veux donc, c'est mettre la deuxième requête dans la première. J'arrive à compter le nombre de missions par projet mais je n'arrive pas à avoir les missions en cours seulement.

    voici la requête qui compte toutes les missions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT count(id_mission) as Nombre, P.ID_PROJET, P.ID_CLIENT, P.ID_COLLABORATEUR, P.ID_ADRESSE_POSTALE, P.CODE_SECTEUR, P.NOM_PROJET, P.DESCRIPTION, P.ID_LAST_USER, P.STIMESTAMP, P.ACTIF
    FROM projet P
    left join mission M on (P.ID_PROJET = M.ID_PROJET)
    left join collaborateur C on (C.ID_COLLABORATEUR = M.ID_COLLABORATEUR)
    WHERE 1 = 1
    GROUP BY P.ID_PROJET
    ORDER BY P.NOM_PROJET
    quelqu'un pourrait m'aider s'il vous plaît?

    Merci par avance

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,


    Et comme ça :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    SELECT 
              count(id_mission) as Nombre
            , P.ID_PROJET
            , P.ID_CLIENT
            , P.ID_COLLABORATEUR
            , P.ID_ADRESSE_POSTALE
            , P.CODE_SECTEUR
            , P.NOM_PROJET
            , P.DESCRIPTION
            , P.ID_LAST_USER
            , P.STIMESTAMP
            , P.ACTIF
    FROM 
            projet P
            LEFT JOIN mission M 
            ON (P.ID_PROJET = M.ID_PROJET)
                  LEFT JOIN collaborateur C 
                  ON (C.ID_COLLABORATEUR = M.ID_COLLABORATEUR)
     
    GROUP BY 
                 P.ID_PROJET
               , P.ID_CLIENT
               , P.ID_COLLABORATEUR
               , P.ID_ADRESSE_POSTALE
               , P.CODE_SECTEUR
               , P.NOM_PROJET
               , P.DESCRIPTION
               , P.ID_LAST_USER
               , P.STIMESTAMP
               , P.ACTIF
     
    HAVING 
              1 = 1
        AND NOW() BETWEEN DATE_DEB_MISSION and DATE_FIN_MISSION 
     
    ORDER BY 
                 P.NOM_PROJET
               , P.ID_PROJET
               , P.ID_CLIENT
               , P.ID_COLLABORATEUR
               , P.ID_ADRESSE_POSTALE
               , P.CODE_SECTEUR
               , P.DESCRIPTION
               , P.ID_LAST_USER
               , P.STIMESTAMP
               , P.ACTIF
    ;
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Déjà merci d'avoir répondu vite

    Par contre quand j'essaye ta requête, mon programme (MySQL Query Browser) me dit que il ne connait pas la colonne DATE_DEB_MISSION.

    "Unknown column 'DATE_DEB_MISSION' in 'having clause'"

    Je ne sais pas trop pourquoi... je dois les mettre dans le SELECT?

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Autant pour moi, exact car la clause HAVING oblige a avoir tous les champs, donc met le aussi dans le GROUP BY et le ORDER BY
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SELECT
              count(*) AS Nombre
            , P.ID_PROJET
            , P.ID_CLIENT
            , P.ID_COLLABORATEUR
            , P.ID_ADRESSE_POSTALE
            , P.CODE_SECTEUR
            , P.NOM_PROJET
            , P.DESCRIPTION
            , P.ID_LAST_USER
            , P.STIMESTAMP
            , P.ACTIF
     
    FROM
            projet P
            LEFT JOIN mission M
            ON (P.ID_PROJET = M.ID_PROJET)
                  LEFT JOIN collaborateur C 
                  ON (C.ID_COLLABORATEUR = M.ID_COLLABORATEUR)
     
    GROUP BY 
                 P.ID_PROJET
                 , M.DATE_DEB_MISSION
                 , M.DATE_FIN_MISSION
     
    HAVING NOW() BETWEEN DATE_DEB_MISSION AND DATE_FIN_MISSION
     
    ORDER BY
                  P.NOM_PROJET
                 , M.DATE_DEB_MISSION
                 , M.DATE_FIN_MISSION
    voici donc la requête qui marche à moitié en fait. Elle me sort le bon nombre de mission active par projet mais le problème c'est que pour un projet Y j'ai X lignes qui me dit pour nombre "1" à chaque ligne avec autant de ligne que de mission active...

    Je ne sais pas si j'ai été clair mais en gros j'ai autant de lignes que de missions alors que mon groupe by est sur le projet. et donc je voudrais une ligne par projet avec le nombre de missions actives à coté.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 098
    Points : 28 403
    Points
    28 403
    Par défaut
    1. Les colonnes ne portant pas sur des foncitons de regroupement doivent apparaitre dans la clause GROUP BY
    2. La clause HAVING doit porter sur le résultat de fonctions de regroupement. Sinon, le filter doit être placé dans la clause WHERE.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    ça ne change rien si je mets tout dans le group by.

    Sinon j'ai fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  count(id_mission) as Nombre, P.ID_PROJET, P.ID_CLIENT, P.ID_COLLABORATEUR, P.ID_ADRESSE_POSTALE, P.CODE_SECTEUR, P.NOM_PROJET, P.DESCRIPTION, P.ID_LAST_USER, P.STIMESTAMP, P.ACTIF
    FROM projet P
    left join mission M on (P.ID_PROJET = M.ID_PROJET)
    left join collaborateur C on (C.ID_COLLABORATEUR = M.ID_COLLABORATEUR)
    WHERE 1 = 1
    AND NOW() BETWEEN DATE_DEB_MISSION and DATE_FIN_MISSION
    GROUP BY P.ID_PROJET
    ORDER BY P.NOM_PROJET
    Le problème c'est que ça ne m'affiche pas les projets qui n'ont pas de missions actives... Y'a-t-il un moyen de pallier ça?

    en fait faudrait faire un mix entre la requête du dessus et celle la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  count(ID_MISSION) as nombre , P.ID_PROJET, P.ID_CLIENT, P.ID_COLLABORATEUR, P.ID_ADRESSE_POSTALE, P.CODE_SECTEUR, P.NOM_PROJET, P.DESCRIPTION, P.ID_LAST_USER, P.STIMESTAMP, P.ACTIF
    FROM projet P
    left join mission M on (P.ID_PROJET = M.ID_PROJET)
    left join collaborateur C on (C.ID_COLLABORATEUR = M.ID_COLLABORATEUR)
    GROUP BY P.ID_PROJET
    ORDER BY P.NOM_PROJET
    qui elle m'affiche tout mes projets avec toutes les missions... je ne vois vraiment pas là.

    Merci de vos réponses en tout cas

Discussions similaires

  1. besoin d'aide pour une requête SQL
    Par cedrix57 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/01/2010, 10h47
  2. Besoin d'aide pour une requête SQL
    Par p_oum dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 26/11/2009, 09h29
  3. Besoin d'aide pour une requête SQL
    Par FranckyVegas dans le forum Langage SQL
    Réponses: 7
    Dernier message: 27/05/2008, 20h16
  4. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  5. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56

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