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 :

Résultat requête avec jointure


Sujet :

MS SQL Server

  1. #1
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut Résultat requête avec jointure
    Bonsoir,

    Je cherche à regrouper les employés absents et leurs badgeages (pour ceux qui ont travaillés une partie de la journée) à une date donnée.
    Le problème est que je n'arrive pas à avoir les deux en même temps, Quand j'ajoute les badgeages j'ai tous les badgeages de tous les employés, alors que je voudrais seulement ceux des agents absent avec leurs congés.
    La requête ci-dessous affiche correctement les employés absents, les parties commentées ajoutent les badgeages.

    Je sais qu'il n'est facile pas de répondre à ma demande sans voir les tables, mais elles sont très grandes.
    Si quelqu'un arrive à comprendre ma requête je le remercie pour son aide.

    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
    SELECT
    A.matric AS Matricule, 
    A.serid AS Equipe, 
    UPPER(C.prenom + '  ' + C.nom) AS 'Prénom   Nom', 
    D.absid AS Motif,
    E.libabs AS 'Libellé',
    CASE 
         WHEN ISNULL(D.temps,0) = 0 THEN ''
         ELSE LEFT(CAST(D.temps AS varchar), 1) + ':' +
           SUBSTRING(CAST(D.temps AS varchar), 2, LEN(D.temps)-1) 
    END AS 'Durée'
    --F.heures AS Heures, 
    --F.minut AS Minutes,
    --F.ess AS Sens
    FROM PERSVAR A
    JOIN PERS C ON A.matric = C.matric
    JOIN AP D ON A.matric = D.matric
    JOIN MA E ON D.absid = E.absid
    --JOIN PT F ON F.matric = D.matric
    	WHERE A.dsitud = (SELECT MAX(dsitud)
    						FROM PERSVAR B
    						WHERE B.matric = A.matric)
    AND '21-01-2010' BETWEEN D.dated AND D.datef
    --AND F.dats = '21-01-2010'
    ORDER BY C.nom

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    LE nom des tables avec les champs utiles et leurs significations

  3. #3
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Voici les structures avec les champs nécessaires des tables en question :

    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
    CREATE TABLE [dbo].[PERS](
    	[ROWID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    	[MATRIC] [int] NOT NULL,
    	[NOM] [varchar](30) NULL,
    	[PRENOM] [varchar](30) NULL
    PRIMARY KEY CLUSTERED 
    ( [ROWID] ASC ))
     
    CREATE TABLE [dbo].[PERSVAR](
    	[ROWID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    	[MATRIC] [int] NULL,
    	[DSITUD] [datetime] NULL,
    	[DSITUF] [datetime] NULL,
    	[SERID] [varchar](6) NULL
    PRIMARY KEY CLUSTERED 
    ( [ROWID] ASC )) 
     
     
    CREATE TABLE [dbo].[AP](
    	[ROWID] [int] IDENTITY(1,1) NOT NULL,
    	[MATRIC] [int] NOT NULL,
    	[DATED] [datetime] NOT NULL,
    	[ABSID] [varchar](4) NOT NULL,
    	[TEMPS] [int] NULL,
    	[DATEF] [datetime] NOT NULL,
    PRIMARY KEY CLUSTERED 
    ( [ROWID] ASC )) 
     
    CREATE TABLE [dbo].[MA](
    	[ROWID] [int] IDENTITY(1,1) NOT NULL,
    	[ABSID] [varchar](4) NOT NULL,
    	[LIBABS] [varchar](30) NULL,
    PRIMARY KEY CLUSTERED 
    ( [ROWID] ASC )) 
     
    CREATE TABLE [dbo].[PT](
    	[ROWID] [int] IDENTITY(1,1) NOT NULL,
    	[MATRIC] [int] NULL,
    	[DATS] [datetime] NULL,
    	[HEURES] [smallint] NULL,
    	[MINUTS] [smallint] NULL,
    	[ESS] [varchar](1) NULL,
    PRIMARY KEY CLUSTERED 
    ( [ROWID] ASC ))
    PERS : Personnel de l'entreprise
    MATRIC Matricule de l'employé
    NOM Nom patronymique
    PRENOM Prénom

    PERSVAR : Personnel : changements de situation (table historique)
    MATRIC Matricule de l'employé
    DSITUD Date de début de situation
    DSITUF Date de fin de situation
    SERID Equipe

    AP : Absences prévisionnelles
    MATRIC Matricule de l'employé
    DATED Date début
    ABSID Code motif d'absence
    TEMPS Durée (uniquement si unité=heure)
    DATEF Date fin

    MA : Motifs d'absences
    ABSID Code motif d'absence
    LIBABS Libellé

    PT : Badgeages
    MATRIC Matricule de l'employé
    DATS Date du badgeage
    HEURES Heure du badgeage
    MINUTS Minute du badgeage
    ESS Sens du badgeage

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    La requête ci-dessous affiche correctement les employés absents,
    Si c'est le cas l'ajout d'une jointure interne ne peut donner ceci:
    Quand j'ajoute les badgeages j'ai tous les badgeages de tous les employés
    Sauf si une information nous échappe.

    Je te propose ceci:

    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
     
     
    SELECT
    A.matric AS Matricule, 
    A.serid AS Equipe, 
    UPPER(C.prenom + '  ' + C.nom) AS 'Prénom   Nom', 
    D.absid AS Motif,
    E.libabs AS 'Libellé',
    CASE 
         WHEN ISNULL(D.temps,0) = 0 THEN ''
         ELSE LEFT(CAST(D.temps AS varchar), 1) + ':' +
           SUBSTRING(CAST(D.temps AS varchar), 2, LEN(D.temps)-1) 
    END AS 'Durée'
    F.heures AS Heures, 
    F.minut AS Minutes,
    F.ess AS Sens
    FROM PERSVAR A
    JOIN PERS C ON A.matric = C.matric
    JOIN AP D ON A.matric = D.matric
    JOIN MA E ON D.absid = E.absid
    LEFT JOIN PT F ON F.matric = D.matric
    AND F.dats = '21-01-2010'
     
    	WHERE A.dsitud = (SELECT MAX(dsitud)
    			  FROM PERSVAR B
    			  WHERE B.matric = A.matric)
    AND '21-01-2010' BETWEEN D.dated AND D.datef
    ORDER BY C.nom

  5. #5
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut


    Ça fonctionne.

    Je ne savais pas qu'il était possible de placer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND F.dats = '21-01-2010'
    après une jointure, et encore moins avant une clause WHERE.

    Merci pour ton aide.

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

Discussions similaires

  1. [MySQL] Utiliser le résultat d'une requête avec jointure
    Par ksper92 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/05/2011, 08h46
  2. Réponses: 1
    Dernier message: 30/10/2009, 08h48
  3. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 02h13
  4. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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