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 :

intervention seconde ligne


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 18
    Par défaut intervention seconde ligne
    Bonjour,

    Je souhaiterai afficher le résultat de la seconde ligne d'une requête. Je m'explique,

    J'ai deux colonnes:
    1ère colonne je souhaite afficher une intervention qui aura lieu prochainement. Exemple: Intervention1, 18/04/2014.
    2ème colonne, afficher l'intervention qui aura lieu après la première. Exemple: Intervention2, 19/04/1014.

    Lorsque la date de la première intervention (qui va être Intervention1), sera dépassée, la seconde intervention apparaîtra dans la première colonne à la place de Intervention1. Et une troisième intervention apparaîtrait à la place du second.

    Pour la première colonne c'est ok, mais je coince sur la deuxième avec cette requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TOP 1 USER_ID, INTERV_DATE, INTERV_LIBELLE, INTERV_LIEU, INTERV_DESCRIPTION FROM TR_INTERVENTION 
                JOIN TR_LABO 
                ON TR_INTERVENTION.LAB_ID = TR_LABO.LAB_ID
                JOIN TR_USER
                ON TR_LABO.LAB_ID = TR_USER.USER_ID
                WHERE TR_LABO.LAB_ID = 1 AND INTERV_OBSELET=0 AND INTERV_DATE >= GETDATE() AND INTERV_ID=(INTERV_ID+1) order by INTERV_DATE;
    J'ai l'impression que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INTERV_ID=(INTERV_ID+1)
    ne donne aucune valeur, par exemple si faisait à la place , j'affiche bien la deuxième ligne d'intervention, j'affiche la troisième ligne d'intervention.

    Merci d'avance, si vous avez une idée !

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Effectivement, aucune ligne de la table dbo.TR_INTERVENTION n'a un identifiant qui est également à lui-même + 1.
    Il vous faut donc effectuer une auto-jointure, c'est à dire une jointure de dbo.TR_INTERVENTION à dbo.TR_INTERVENTION, dont le prédicat est INTERV_ID = INTERV_ID + 1.

    Reprenons d'abord votre code, que j'ai un peu formaté, mais surtout où j'ai aliasé le nom des tables :

    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
    SELECT		TOP 1 U.USER_ID
    		, I.INTERV_DATE
    		, I.INTERV_LIBELLE
    		, I.INTERV_LIEU
    		, I.INTERV_DESCRIPTION
    FROM		dbo.TR_INTERVENTION AS I
    INNER JOIN	dbo.TR_LABO AS L
    			ON I.LAB_ID = L.LAB_ID
    INNER JOIN	dbo.TR_USER AS U
    			ON L.LAB_ID = U.USER_ID
    WHERE		L.LAB_ID = 1
    AND		I.INTERV_OBSELET = 0
    AND		I.INTERV_DATE >= GETDATE()
    AND		INTERV_ID = INTERV_ID + 1
    ORDER BY	I.INTERV_DATE;
    Votre future requête va ressembler à :

    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
    SELECT		TOP 1 U.USER_ID
    		, I1.INTERV_DATE AS date_1e_intervention
    		, I2.INTERV_DATE AS date_2e_intervention
    		, I1.INTERV_LIBELLE
    		, I1.INTERV_LIEU
    		, I1.INTERV_DESCRIPTION
    FROM		dbo.TR_INTERVENTION AS I1
    INNER JOIN	dbo.TR_INTERVENTION AS I2
    			ON I1.INTERV_ID = I2.INTERV_ID + 1
    			-- AND ?
    INNER JOIN	dbo.TR_LABO AS L
    			ON I1.LAB_ID = L.LAB_ID
    INNER JOIN	dbo.TR_USER AS U
    			ON L.LAB_ID = U.USER_ID
    WHERE		L.LAB_ID = 1
    AND		I1.INTERV_OBSELET = 0
    AND		I1.INTERV_DATE >= GETDATE()
    ORDER BY	I1.INTERV_DATE;
    J'ai mis un point d'interrogation dans le prédicat de jointure, car je pense que joindre sur un incrément de l'ID d'intervention est au mieux insuffisant, au pire incorrect.

    @++

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 18
    Par défaut Réponse intervention sql
    Bonjour,

    Merci de m'avoir répondu, j'ai trouvé une solution.

    Afficher la première intervention pas expirée, différente de la prochaine intervention. Voici le code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TOP 1 USER_ID, INTERV_DATE, INTERV_LIBELLE, INTERV_LIEU, INTERV_DESCRIPTION FROM TR_INTERVENTION 
              JOIN TR_LABO 
              ON TR_INTERVENTION.LAB_ID = TR_LABO.LAB_ID
              JOIN TR_USER
              ON TR_LABO.LAB_ID = TR_USER.USER_ID
              WHERE TR_LABO.LAB_ID = @USER_ID AND INTERV_OBSELET=0 AND                                                        
              TR_INTERVENTION.INTERV_ID <> (SELECT TOP 1 INTERV_ID FROM TR_INTERVENTION JOIN TR_LABO 
              ON TR_INTERVENTION.LAB_ID = TR_LABO.LAB_ID 
              WHERE TR_LABO.LAB_ID = @USER_ID AND TR_INTERVENTION.INTERV_OBSELET=0 AND INTERV_ID = INTERV_ID AND INTERV_DATE >= GETDATE() order by TR_INTERVENTION.INTERV_DATE) 
              AND INTERV_DATE >=GETDATE() order by INTERV_DATE;

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

Discussions similaires

  1. lire seconde ligne d'un fichier avec fgets
    Par key94 dans le forum C
    Réponses: 6
    Dernier message: 29/12/2010, 18h43
  2. Réponses: 6
    Dernier message: 08/08/2007, 17h41
  3. Réponses: 3
    Dernier message: 06/04/2007, 09h13
  4. Requête avec retour d'1 seule ligne de la seconde table
    Par Fred_76 dans le forum Requêtes
    Réponses: 16
    Dernier message: 09/11/2005, 13h46

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