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

MS SQL Server Discussion :

Requêtes imbriquées et trier par date contrat


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut Requêtes imbriquées et trier par date contrat
    Bonjour,

    Petit problème sur comment interpréter la requete pour obtenir le résultat souhaité.

    Exemple
    (cf. tableau en pièce jointe.)

    On a une liste des personnes disposant de plusieurs contrats. Je souhaite récupérer le contrat CDI (date null) ou bien la date du contrat la plus récente !

    Sur la pièce jointe, je vous ai surligné les lignes qu'on veut garder.

    Requete presque bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT nom,prénom,date FROM table a
    where ( (date is null) OR
    date=(SELECT MAX(b.date) FROM table b))
    Le souci avec cette requête, ça me sort 2 lignes doublons pour les personnes ayant un contrat CDI et un CDD.
    exemple sur le tableau :
    pour la personne A Thomas j'ai la ligne avec date vide et également celui avec date=05/08/2012.

    j'ai essayé plusieurs combinaisons qui deviennent vite casse-tête...

    Avez-vous une idée pour solutionner ce problème ?


    [Edit] : j'utilise bien SQL Server pour faire les requêtes
    Merci d'avance.
    Images attachées Images attachées  

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Si tu es en SQL Server 2005 ou plus, tu peux utiliser une cte (Common Table Expression) et une fonction de classement (ROW_NUMBER). Il faut également filtrer sur le type de contrat 'CDI'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH cte AS (
    	SELECT Nom, Prénom, Date, ROW_NUMBER() OVER (PARTITION BY Nom, Prénom ORDER BY COALESCE(Date, GETDATE()) DESC) AS nb
    	FROM a
    	WHERE TypeContrat = 'CDI'
    )
    SELECT Nom, Prénom, Date FROM cte
    WHERE nb = 1

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    Je ne dispose pas de type de contrat, j'ai uniquement des dates...

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    J'ai bien une solution à base de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX( ISNULL([Date], '9999-12-12') )
    ...mais c'est moche !

  5. #5
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Citation Envoyé par Cyr69 Voir le message
    Je ne dispose pas de type de contrat, j'ai uniquement des dates...
    Ok, je n'avais pas fait attention que lorsque ça concernait un contrat CDI la date était NULL... Ce qui est d'ailleurs logique, autant pour moi.

    Il suffit donc d'enlever la clause WHERE TypeContrat = 'CDI' ou de mettre en place la solution de pcaboche.
    La solution que je propose considère qu'un CDD a forcément une date antérieure à la date du jour pour prioriser les lignes CDI, mais ce n'est peut être pas la réalité dans ton modèle.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    @SQLDev, effectivement il se peut que les CDD aient des dates supérieures à aujourd'hui.

    sinon y a une solution que nous avons trouvé mais bon faut que je réussisse à l'adapter en fonction des champs que nous souhaitons (avec 9 jointures c'est vite casse tête...)

    Soluce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select a.nom,a.prenom, max(a.date) from table A
    right join (select nom,prenom from table where date is not null
    EXCEPT
    select nom,prenom from table where date is null) B
    on a.nom=b.nom
    group by a.nom,a.prenom
    UNION ALL
    select c.nom,c.prenom,c.date from table c where date is null
    J'avoue c'est un peu chaud la mais on a le résultat souhaité. Vous en pensez quoi ?

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

Discussions similaires

  1. [Criteria][Order] trier par date
    Par CPI_en_mousse dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/07/2007, 14h33
  2. [Paradox] Trier par date
    Par Fabs dans le forum Bases de données
    Réponses: 5
    Dernier message: 08/11/2006, 19h41
  3. Requête SQL de tri par date
    Par Alain15 dans le forum Requêtes
    Réponses: 8
    Dernier message: 03/08/2006, 08h34
  4. trier par date
    Par tounsi dans le forum Oracle
    Réponses: 1
    Dernier message: 23/02/2006, 16h46
  5. [JSP] Trier par date une liste de fichier en JSP
    Par Total dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 21/02/2006, 15h38

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