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 :

Jointure avec données NULL


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Par défaut Jointure avec données NULL
    Bonjour,

    J'ai une table qui contient 2 lignes pour chaque article qui est pesé (une fois à l'entrée, et une fois à la sortie). L'article arrive sur un plateau X et ressort soit sur un plateau Y, soit sur aucun plateau.

    J'ai donc une table qui contient disons les données suivantes :
    article - poids - plateauentree - plateausortie
    article1 - 500 - 1 -
    article1 - - - 2
    article2 - 700 - 3 -
    article2 - - -

    Je veux avoir comme résultat les données de l'article sur une même ligne, même si le plateau de sortie est null.

    Si je mets le code suivant, il me manque 1 article:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T1.article, T1.poids, T1.plateauentree, T2.plateausortie
    FROM Table1 AS T1 LEFT JOIN Table1 AS T2 ON T1.article=T2.article
    WHERE T1.poids is not null AND T2.plateausortie is not null;
    et avec celui-ci, j'en ai de trop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T1.article, T1.poids, T1.plateauentree, T2.plateausortie
    FROM Table1 AS T1 LEFT JOIN Table1 AS T2 ON T1.article=T2.article
    WHERE T1.poids is not null;
    Quelqu'un aurait-il une piste de solution pour m'aider?
    Merci!

  2. #2
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut Design
    Bonjour,


    Il me semble bizarre d'avoir deux lignes dans une table pour une entité, à moins que votre entité soit une pesée entrée-sortie plutôt qu'un article.

    J'aurai plutôt vu ceci

    • Une table article (articleid)
    • Une table plateau (plateauid)
    • Une table pesée (articleid, poids, plateauid, bPlateauEntree, ...)


    Avec bPlateauEntree au niveau de plateau si c'est une caractéristique du plateau plutôt que de la pesée (si un plateau en entrée ne deviendra jamais un plateau en sortie et inversement).

    Avec votre design actuel, est ce que ceci peut vous aider ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare @t table (article varchar(50),poids int, plateauentree int, plateausortie int)
    insert into @t select 'article1', 500, 1, null
    insert into @t select 'article1', 550, null, 2
    insert into @t select 'article2', 700, 3, null
    insert into @t select 'article2', null, null, null 
     
    select T1.article, T1.poids as poids_entree, T1.plateauentree, T2.poids as poids_sortie, T2.plateausortie from @t T1
    left join @t T2 on T1.article = T2.article 
    where 
    	T1.plateauentree is not null
    and 
    	T2.plateauentree is null
    @+

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Par défaut
    Merci pour ta réponse agemis31.

    Effectivement, c'est une table de pesée entrée-sortie, mais le numéro de plateau peut être différent à l'entrée et à la sortie. Il y a aussi des cas où l'on n'a pas de plateau ni à l'entrée, ni à la sortie.

    Le design de la bd est baucoup plus complexe que décrit, mais je l'ai simplifié au max pour poser ma question. En gros, je veux pouvoir ramener le plateau de sortie sur la même ligne que toutes les autres informations contenue dans le premier enregistrement avec une requête, si plateau de sortie il y a.

    Ton code m'a donné une piste de solution, mais si je n'ai ni plateau d'entrée ni plateau de sortie, ma requête ne sort pas de résultat.

    Merci encore.

  4. #4
    Membre chevronné Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Par défaut Ca n'a pas l'air simple !
    Bonsoir,

    C'est bizarre cette asymétrisme entre le poids (unique) et les deux plateaux.


    Est ce ce ceci fonctionne ?

    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
    -- attribue le poids en entrée ou en sortie
    ;with c (article, poids_entree, plateauentree, poids_sortie, plateau_sortie)
    as
    (
    select T1.article, 
    case 
    	ISNULL(plateauentree,0) 
    	when 0 then null
    	else poids 
    end as poids_entree, 
    T1.plateauentree,
    case 
    	ISNULL(plateausortie,0) 
    	when 0 then null
    	else poids 
    end as poids_sortie, 
    T1.plateausortie
    from @t T1
    )
    ,
    -- il faut prendre tous les articles
    A (article) as (select distinct article from c)
    select a.article, c1.plateauentree, c1.poids_entree, c2.plateau_sortie, c2.poids_sortie
    from A  
    left join c c1 on a.article = c1.article and c1.poids_entree is not null
    left join c c2 on a.article = c2.article and c2.poids_sortie is not null
    Il y a peut être à creuser du côté unpivot pour cette table.

    @+

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    N'oubliez jamais que les tables sont par nature ensembliste DONC PAS D'ORDRE ! Donc il n'existe pas de ligne précédente ni suivante... Ce que vous avez supposé par vos requêtes...

    Voici la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T1.article, COALESCE(T1.poids, T2.Poids), 
                       COALESCE(T1.plateauentree, T2.plateauentree),
                       COALESCE(T2.plateausortie, T1.plateausortie)
    FROM   Table1 AS T1 
           LEFT OUTER JOIN Table1 AS T2 
                ON T1.article=T2.article
    A lire sur le sujet : http://blog.developpez.com/sqlpro/p5...sont-des-ense/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Par défaut
    Merci à vous 2, agemis31 et SQLpro pour vos réponses,

    SQLpro, je ne connaissais pas cette fonction, COALESCE. Je sens que je me rapproche d'une solution, mais quand j'exécute ma requête avec le COALESCE, j'ai comme résultat 2 lignes pour chaque article, la première ayant NULL comme plateau de sortie, et la seconde ayant le plateau de sortie.

    Je vais vous mettre mon véritable code ici, sans simplification, j'espère que vous pourrez m'aider à trouver mon problème...

    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
    SELECT     TT.STATUS, 
    TD1.TRANS_NO AS NoTrans, 
    TT.TICKET_DATE AS DateSortie, 
    A.DESCRIPTION AS Transporteurs, 
    P.DESCRIPTION AS Produit,
    O.DESCRIPTION AS Secteurs, 
    D.DESCRIPTION AS Destination, 
    TD1.USER_TEXT1 AS SDDI, 
    TD1.USER_TEXT2 AS PlateauEntree, 
    COALESCE (td.USER_TEXT3, TD1.USER_TEXT3) AS PlateauSortie,
    TT.TOTAL_NET_WEIGHT AS PoidNet,
    TD1.WEIGHT AS Poid
    FROM         overdrive.TRANSACTION_DETAIL TD1 
    LEFT OUTER JOIN overdrive.PRODUCT P ON TD1.PRODUCT_ID = P.PRODUCT_ID 
    LEFT OUTER JOIN overdrive.ORIGIN O ON TD1.ORIGIN_ID = O.ORIGIN_ID 
    RIGHT OUTER JOIN overdrive.TRANSACTION_TABLE TT ON TD1.TRANS_NO = TT.TRANS_NO 
    INNER JOIN overdrive.ACCOUNT A ON TT.ACCOUNT_ID = A.ACCOUNT_ID 
    LEFT OUTER JOIN overdrive.DESTINATION D ON TD1.DESTINATION_ID = D.DESTINATION_ID 
    LEFT OUTER JOIN overdrive.TRANSACTION_DETAIL td ON TD1.TRANS_NO = td.TRANS_NO
    WHERE     (TT.STATUS IN ('C', 'M')) AND (TD1.NET_WEIGHT IS NOT NULL)
    Merci encore!

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

Discussions similaires

  1. Résultat jointure avec champs null
    Par ideal23 dans le forum Langage SQL
    Réponses: 26
    Dernier message: 12/12/2011, 11h12
  2. [AC-2000] Pb de jointure avec valeur null
    Par popysan dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 07/04/2011, 14h37
  3. jointure avec champ à null
    Par radahm dans le forum PL/SQL
    Réponses: 2
    Dernier message: 03/11/2009, 10h51
  4. Requete select : jointure avec champs null
    Par Tidus159 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 06/06/2008, 13h31
  5. Réponses: 14
    Dernier message: 05/09/2006, 17h01

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