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 :

Jonction entre 3 tables [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Par défaut Jonction entre 3 tables
    Bonjour,

    J'ai un soucis pour effectuer ma requête... je dois joindre 3 tables (OF, SPEC et RLX)

    OF : Ordre de fabrication
    SPEC: Spécifications produit
    RLX: Liste des rouleaux

    Données:

    Table OF
    Num | Code | DateFabrique
    1 | 256 | 2017-10-24
    2 | 528 | 2017-10-24
    3 | 984 | 2017-10-25

    Table SPEC
    Code | DateEnregistrementSpec | Specs
    256 | 2017-10-05 | 5,8
    256 | 2017-10-20 | 5,7
    528 | 2017-10-08 | 10,2
    528 | 2017-10-16 | 10,3

    Table RLX
    Num | Data | DateEnregistré
    1 | 5,85 | 2017-10-24 08:00
    1 | 5,79 | 2017-10-24 09:00
    1 | 5,82 | 2017-10-24 10:00
    2 | 10,25 | 2017-10-24 11:00
    2 | 10,24 | 2017-10-24 12:00
    2 | 10,31 | 2017-10-24 13:00
    2 | 10,28 | 2017-10-24 14:00

    J'aimerais faire une requête sur une journée (2017-10-24) de ma liste de rouleaux associés à l'OF et la SPEC la plus récente.
    Résultat souhaité
    Num | DateEnregistré | Code | Specs | Data
    1 | 2017-10-24 08:00 | 256 | 5,7 | 5,85
    1 | 2017-10-24 09:00 | 256 | 5,7 | 5,79
    1 | 2017-10-24 10:00 | 256 | 5,7 | 5,82
    2 | 2017-10-24 11:00 | 528 | 10,3 | 10,25
    2 | 2017-10-24 12:00 | 528 | 10,3 | 10,24
    2 | 2017-10-24 13:00 | 528 | 10,3 | 10,31
    2 | 2017-10-24 14:00 | 528 | 10,3 | 10,28

    Voici le code que j'utilise
    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
    SELECT 
    Num,
    DateEnregistré,
    Code,
    Specs,
    Data
     
    FROM SPEC
    LEFT OUTER JOIN OF
    ON SPEC.Code = OF.Code
    LEFT OUTER JOIN RLX
    ON RLX.Num LIKE OF.Num
    WHERE 1= 1
    AND (RLX.DateEnregistré > CONVERT(DATETIME, '2017-10-24 00:00:00.000', 102)) 
    AND (RLX.DateEnregistré < CONVERT(DATETIME, '2017-10-24 23:59:59.000', 102))
    ORDER BY RLX.DateEnregistré ASC
    Mais j'obtiens cela..

    Num | DateEnregistré | Code | Specs | Data
    1 | 2017-10-24 08:00 | 256 | 5,7 | 5,85
    1 | 2017-10-24 08:00 | 256 | 5,8 | 5,85
    1 | 2017-10-24 09:00 | 256 | 5,7 | 5,79
    1 | 2017-10-24 09:00 | 256 | 5,8 | 5,79
    1 | 2017-10-24 10:00 | 256 | 5,7 | 5,82
    1 | 2017-10-24 10:00 | 256 | 5,8 | 5,82
    2 | 2017-10-24 11:00 | 528 | 10,3 | 10,25
    2 | 2017-10-24 11:00 | 528 | 10,2 | 10,25
    2 | 2017-10-24 12:00 | 528 | 10,3 | 10,24
    2 | 2017-10-24 12:00 | 528 | 10,2 | 10,24
    2 | 2017-10-24 13:00 | 528 | 10,3 | 10,31
    2 | 2017-10-24 13:00 | 528 | 10,2 | 10,31
    2 | 2017-10-24 14:00 | 528 | 10,3 | 10,28
    2 | 2017-10-24 14:00 | 528 | 10,2 | 10,28

    Avez-vous une solution à mon problème??

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Vous pouvez faire comme ceci (pas testé):

    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
     
    WITH CTE AS (SELECT 
    Num,
    DateEnregistré,
    Code,
    Specs,
    Data,
    ROW_NUMBER() OVER(PARTITION BY SPEC.Code  ORDER BY SPEC.DateEnregistrementSpec DESC) AS RN
     
    FROM SPEC
    LEFT OUTER JOIN OF
    ON SPEC.Code = OF.Code
    LEFT OUTER JOIN RLX
    ON RLX.Num LIKE OF.Num
    WHERE 1= 1
    AND (RLX.DateEnregistré > CONVERT(DATETIME, '2017-10-24 00:00:00.000', 102)) 
    AND (RLX.DateEnregistré < CONVERT(DATETIME, '2017-10-24 23:59:59.000', 102))
    )
    SELECT 
    Num,
    DateEnregistré,
    Code,
    Specs,
    Data
    FROM CTE
    WHERE RN = 1
    ORDER BY RLX.DateEnregistré ASC

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Par défaut
    Merci de votre retour!

    Je viens de tester mais cela me retourne une seule ligne (le premier rouleau de la journée avec la spec la plus récente)
    Maintenant il me faudrait la liste de tous les rouleaux de la journée.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    alors il suffit d'appliquer le même principe (ROW_NUMBER...) mais uniquement sur la table SPECS

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 5
    Par défaut
    Il faut que je remplace le ROW_NUMBER ou il faut que j'en ajoute un? Désolé je suis novice en SQL SERVER...
    Sinon avec votre code, j'obtiens le premier rouleau fabriqué de chaque code produit fabriqué dans la journée.

    Par exemple RN=1:
    Num | DateEnregistré | Code | Specs | Data
    1 | 2017-10-24 08:00 | 256 | 5,7 | 5,85
    2 | 2017-10-24 11:00 | 528 | 10,3 | 10,25

    Par exemple RN BETWEEN 1 AND 2:
    Num | DateEnregistré | Code | Specs | Data
    1 | 2017-10-24 08:00 | 256 | 5,7 | 5,85
    1 | 2017-10-24 09:00 | 256 | 5,7 | 5,79
    2 | 2017-10-24 11:00 | 528 | 10,3 | 10,25
    2 | 2017-10-24 12:00 | 528 | 10,3 | 10,24

    Par exemple RN BETWEEN 1 AND 3: (alors que je n'ai fabriqué que 2 rouleaux sur le num 1)
    1 | 2017-10-24 08:00 | 256 | 5,7 | 5,85
    1 | 2017-10-24 08:00 | 256 | 5,8 | 5,85
    1 | 2017-10-24 09:00 | 256 | 5,7 | 5,79
    2 | 2017-10-24 11:00 | 528 | 10,3 | 10,25
    2 | 2017-10-24 12:00 | 528 | 10,3 | 10,24
    2 | 2017-10-24 13:00 | 528 | 10,3 | 10,31

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    ç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
     
    WITH CTE AS (
    	SELECT *, ROW_NUMBER() OVER(PARTITION BY SPEC.Code  ORDER BY SPEC.DateEnregistrementSpec DESC) AS RN
    	FROM SPEC
    )
    SELECT 
    	Num,
    	DateEnregistré,
    	Code,
    	Specs,
    	Data 
    FROM CTE AS SPEC
    LEFT OUTER JOIN OF
    ON SPEC.Code = OF.Code
    LEFT OUTER JOIN RLX
    ON RLX.Num LIKE OF.Num
    WHERE 1= 1
    AND (RLX.DateEnregistré > CONVERT(DATETIME, '2017-10-24 00:00:00.000', 102)) 
    AND (RLX.DateEnregistré < CONVERT(DATETIME, '2017-10-24 23:59:59.000', 102))
    AND  RN = 1
    ORDER BY RLX.DateEnregistré ASC

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

Discussions similaires

  1. [MySQL] Aide jonction entre 2 tables
    Par Boudoire dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/05/2015, 16h56
  2. Jonction entre 2 tables et afficher toutes les colonnes
    Par Kermichou dans le forum Bases de données
    Réponses: 0
    Dernier message: 21/03/2012, 16h56
  3. Jonction entre 2 tables
    Par jesaye dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/11/2011, 21h36
  4. Requete select pour récupérer les no match entre 2 tables
    Par Celina dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/12/2003, 11h59
  5. Update entre 2 tables
    Par jfox dans le forum SQL
    Réponses: 8
    Dernier message: 04/11/2003, 10h22

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