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

Développement SQL Server Discussion :

[SQL SERVER 2005] Detail sur une requete avec un min(date)


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut [SQL SERVER 2005] Detail sur une requete avec un min(date)
    Bonjour,

    Voici une requête typique SQL que je n'arrive jamais a faire.
    Je prend un exemple au hasard afin d'en discuter.
    J'ai une table VOITURE(id, nom, couleur, prix)
    Et j'ai une table REPARATION(id,idVoiture, dateReparation, raisonReparation, prixReparation)

    Je souhaite afficher pour chaque voiture la réparation la plus ancienne avec la dateReparation, la raisonReparation.

    Si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT voiture.id, min(dateReparation)
    FROM VOITURE
    LEFT JOIN REPARATION on voiture.id = reparation.idVoiture
    group by voiture.id
    j'ai bien pour chaque voiture la date de reparation la plus ancienne.

    Maintenant je veux la emme chose en ayant seulement en plus la raisonReparation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT voiture.id, min(dateReparation), raisonReparation
    FROM VOITURE
    LEFT JOIN REPARATION on voiture.id = reparation.idVoiture
    group by voiture.id, raisonReparation
    Je suis donc obligé de la rajouter dans le group by et du coup j'ai plus seulement la réparation la plus ancienne mais les réparation les plus ancienne pour chaque raisonReparation différentes. Ce qui veut dire que si j'ai 2 raison différentes j'ai 2 lignes. Or moi je ne veux que la raison de la réparation la plus ancienne.

    Comment faut-il procéder?

    Merci,

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    WIT T1(VOITURE_ID, DATE_REP_MIN)
    AS(
    SELECT voiture.id, min(dateReparation) 
    FROM VOITURE 
    LEFT JOIN REPARATION ON voiture.id = reparation.idVoiture 
    GROUP BY voiture.id
    )
    SELECT T1.VOITURE_ID, T1.DATE_REP_MIN, REP.RAISONREPARATION
    FROM T1 INNER JOIN REPARATION REP
    ON T1.VOITURE_ID = REP.IDVOITURE
    Je pense que ceci devrait le faire si une faute de syntaxe ne s'est pas intercalée dans le tas.
    Kropernic

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Merci pour ta réponse.
    je vois le principe mais que signifie ton WIT?
    ça ne fonctionne pas chez moi.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ah bin voilà, manque un "h" lol.

    C'est "WITH" bien sûr et pas "WIT".

    Cela sert à créer une CTE (Common Table Expression).

    En fait, ce que je fais :
    - je place ta première requête dans une CTE (sorte de table temporaire)
    - je fais une requête sur cette table (que j'ai nommé T1) en faisant une jointure sur la table réparation.

    Attention ! Je remarque que j'ai oublié de placer la date de réparation dans la jointure !!!
    A toi donc de l'ajouter
    Kropernic

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    lol quel crétin je suis, j'aurais du comprendre que c'était WITH.
    Merci en tout cas ça fonctionne. Je pense que le with va m'aider à résoudre pas mal de problème.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/06/2017, 11h22
  2. Réponses: 9
    Dernier message: 01/09/2011, 16h13
  3. Réponses: 8
    Dernier message: 09/02/2007, 12h58
  4. [C#/SQL Server 2005] Comment créer une base de donnée par le code ?
    Par FraktaL dans le forum Accès aux données
    Réponses: 4
    Dernier message: 09/09/2006, 17h27
  5. [sql server 2000]aide pour une requete
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 22/05/2006, 18h24

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