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 :

Requête SQL problématique


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Points : 182
    Points
    182
    Par défaut Requête SQL problématique
    Salut tout le monde,
    Erf me voila obligé de poster pour une requête certes toute bête mais qui me pose problème. Voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT idSociete, projet, max(date)
    FROM `db_prospect_client`.`prospect_appel`
    WHERE projet <> 'aucun'
    GROUP BY idSociete
    A la base la requête est plus complexe mais la je simplifie pour bien comprendre et schématiser.
    EN gros, cette requête est sensé me retourner le projet (c'est un numéro correspondant au nombre de mois), le tout regroupé par idSociété et avec la date maximale. Je veux donc le projet le plus récent pour une société.

    Gros problème: il me regroupe par société, il me sélectionne la dernière date mais le numéro de projet n'est pas celui correspondant à la date la plus récente. Comment faire correspondre la date la plus récente et le projet qui lui est lié??
    J'espère avoir été clair car c'est dur de s'expliquer parfois!!

    Merci d'avance à l'équipe.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Votre requête vous renverra la date max groupé par idSociete et par projet. Vous n'avez pas mis projet dans votre GROUP BY, c'est une erreur de syntaxe et la plupart des sgbd ne l'acceptent pas, vous n'avez pas précisé le votre mais j'imagine qu'il s'agit de MySQL.

    Pour votre problème, il vous faut récupérer la date max pour chaque idSociete, puis faire une jointure sur le couple date/idSociete obtenu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT idSociete, projet, date
    FROM `db_prospect_client`.`prospect_appel` appel
    join (SELECT idSociete, max(date) as datemax
         FROM `db_prospect_client`.`prospect_appel`
         WHERE projet <> 'aucun'
         GROUP BY idSociete) appelmax
    ON appel.idSociete = appelmax.idSociete
    AND appel.date = appelmax.datemax
    Au passage, il est fortement deconseillé de nomer une colonne 'date', c'est un mot reservé en SQL.
    Et ce type de probleme a été traité des dizaines de fois, peut être que la fonction recherche aurait pu vous aider, en supposant que vos predecesseurs aient choisi un titre plus précis que le classique 'probleme requete SQL'

    EDIT : tiens, je viens d'en lire un qui date d'hier, mais encore une fois le titre n'aide pas la recherche : http://www.developpez.net/forums/d73...eme-selection/

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Points : 182
    Points
    182
    Par défaut
    Bonjour et merci pour votre réponse,
    Oui bah je sais pour le champ date (c'est pas moi qui ait crée la base de données). Bon là j'ai bien reçu votre requête j'ai une erreur qui me renvoie idSociete ambigous (j'imagine qu'il faut preciser la table avant).
    Je vais voir ce que je peux faire (c'est une syntaxe que je n'ai encore jamais utilisé).
    Merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Oui, j'ai fait une erreur en ne nommant pas la table devant les colonnes sélectionnées.
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT appel.idSociete, appel.projet, appel.date
    FROM `db_prospect_client`.`prospect_appel` appel
    JOIN (SELECT idSociete, max(date) AS datemax
         FROM `db_prospect_client`.`prospect_appel`
         WHERE projet <> 'aucun'
         GROUP BY idSociete) appelmax
    ON appel.idSociete = appelmax.idSociete
    AND appel.date = appelmax.datemax

  5. #5
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Points : 182
    Points
    182
    Par défaut
    Oui, la requête fonctionne bien. A présent, petite question et dernière j'espère?
    Je dois sélectionner le nom du contact, de la société et le telephone correspodant. Bref, où selectionnez ces champs et où faire les jointures?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT appel.idSociete, projet, date, prospect
    FROM `db_prospect_client`.`prospect_appel` appel (mettre les autres tables ici??)
    JOIN (
    SELECT prospect_appel.idSociete, max(date) AS datemax
    FROM `db_prospect_client`.`prospect_appel`
    WHERE projet <> 'aucun'
    GROUP BY idSociete
    ) appelmax
    ON appel.idSociete = appelmax.idSociete
    //Faire les conditions ici?
    AND appel.date = appelmax.datemax

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Il faut faire une seconde jointure sur la table contenant ces informations complémentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT appel.idSociete, projet, date, prospect, AutreTable.NomContact, AutreTable.telephone
    FROM `db_prospect_client`.`prospect_appel` appel
    JOIN (
         SELECT prospect_appel.idSociete, max(date) AS datemax
         FROM `db_prospect_client`.`prospect_appel`
         WHERE projet <> 'aucun'
         GROUP BY idSociete
         ) appelmax
    ON appel.idSociete = appelmax.idSociete
    AND appel.date = appelmax.datemax
    JOIN AutreTable
    ON <Conditions de jointure>
    Il nous faudrait la structure de vos table pour une requête plus précise.

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Points : 182
    Points
    182
    Par défaut
    Merci de passer autant de temps avec moi
    Voici les informations demandées:

    Je veux : prospect_societe.nom, prospect_contact_societe.nom, telephone, projet

    Les tables avec les champs sur lesquels faire les jointures:
    prospect_societe (champ id)
    prospect_appel (champ idSociete)
    prospect_contact_societe (champ idSociete)

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Ca donne ç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
     
    SELECT appel.idsociete,
           appel.projet,
           appel.DATE,
           appel.prospect,
           societe.nom,
           contact.nom,
           contact.telephone,
           contact.projet
    FROM   `db_prospect_client`.`prospect_appel` appel
           JOIN (SELECT   prospect_appel.idsociete,
                          Max(DATE) AS datemax
                 FROM     `db_prospect_client`.`prospect_appel`
                 WHERE    projet <> 'aucun'
                 GROUP BY idsociete) appelmax
             ON appel.idsociete = appelmax.idsociete
                AND appel.DATE = appelmax.datemax
           JOIN `db_prospect_client`.`prospect_societe` societe
             ON societe.id = appel.idsociete
           JOIN `db_prospect_client`.`prospect_contact_societe` contact
             ON contact.idsociete = appel.idsociete
    La description complete des trois tables pourrait aider, j'ai quelques doutes sur la pertinence des colonnes selectionées.

  9. #9
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Points : 182
    Points
    182
    Par défaut
    Et bien un grand merci et félicitations pour ton niveau.

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

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 15h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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