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

Langage SQL Discussion :

Affichage d'une colonne sur une table pas complète


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut Affichage d'une colonne sur une table pas complète
    Bonjour,

    Je me remets depuis quelques jours aux requêtes SQL, j'ai un petit doute et trou de mémoire.
    J'ai par exemple une table article sur laquelle je veux afficher le code.

    Tout simplement
    Select Code
    From Article

    Mais je veux afficher une deuxième colonne, un prix par exemple qui appartient à une autre table "tarif". Par contre un article n'apparait pas forcément dans la table des tarifs, mais je veux tout de même qu'il s'affiche avec en première colonne son code bien sûr et en deuxième colonne que cela reste à blanc.
    En sachant que j'ai également des restrictions à faire sur la table tarifs.
    Exemple de la table tarifs il y a le code, prix et une année comme suit :
    A - 3,41€ - 2009
    A - 3,43€ - 2010
    A - 3,45€ - 2011
    B - 2,24€ - 2009
    B - 2.27€ - 2010

    Donc je fais le lien sur le code article A ou B. Mais je veux choisir d'afficher le prix 2011. Le A a bien un prix mais pas le B par contre je veux qu'il s'affiche tout de même avec la colonne prix à blanc.

    Comment procéder, comment mettre en lien les deux tables ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Pour répondre à ton besoin, il faut utiliser une jointure externe.

    Afin de combler tes trous de mémoire, tu pourras utilement relire ce tutoriel sur les jointures.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut
    J'ai bien lu ton tutoriel maintenant j'ai une gêne car ma sélection de base (sans parler de la jointure gauche) concerne déjà plusieurs table et plusieurs sélection voir ci-dessous :
    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
    Select P.BPR_0, PD.ITMREF_0, B.BPSNUM_0, IT.TSICOD_0, PD.ITMDES_0, P.INVTYP_0, PD.QTYSTU_0, PD.STU_0, P.CUR_0, PD.AMTNOTLIN_0, I.STOFCY_0, PD.ACCDAT_0, C1.STOFCY_0, C1.CSTTYP_0, C1.YEA_0, C1.VLTTOT_0, C2.VLTTOT_0, PR.DCGVAL_1, PD.NUM_0, PD.PIDLIN_0
    From PINVOICE P, PINVOICED PD, BPSUPPLIER B, ITMFACILIT I, ITMMASTER IT, ITMCOST C1, ITMCOST C2
    Where P.NUM_0=PD.NUM_0
    And P.BPR_0=B.BPSNUM_0
    And PD.ITMREF_0=I.ITMREF_0
    And PD.ITMREF_0=IT.ITMREF_0
    And PD.ITMREF_0=C1.ITMREF_0
    And PD.ITMREF_0=C2.ITMREF_0
    And P.BPR_0!=PR.PLICRI1_0
    And PD.ITMREF_0!=PR.PLICRI2_0
    And (P.BPR_0 between '{?fourdeb}' and '{?fourfin}')
    And (PD.ACCDAT_0 between {?datedeb} and {?datefin})
    And (PD.ITMREF_0 between '{?artdeb}' and '{?artfin}')
    And P.CUR_0='EUR'
    And I.STOFCY_0='LOU'
    And C1.STOFCY_0='LOU'
    And C1.CSTTYP_0=3
    And C1.YEA_0=2012
    And C2.STOFCY_0='LOU'
    And C2.CSTTYP_0=2
    And C2.YEA_0=2012
    Et ce que je veux rajouter c'est et cette partie là qui peut renvoyer ou non un résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    From PPRICLIST PR
    And PR.DCGVAL_1>0
    And (PD.ACCDAT_0 between PR.PLISTRDAT_0 and PR.PLIENDDAT_0)
    Je ne vois pas comment refaire ce lien.

    Merci d'avance

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Commence par reprendre ta requête en utilisant les jointures normalisées (INNER JOIN ... ON ...), ce sera déjà tout de suite plus lisible.
    Il deviendra alors facile de remplacer une jointure stricte par une jointure externe à l'endroit nécessaire.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT P.BPR_0, PD.ITMREF_0
    FROM PINVOICE P
    INNER JOIN PINVOICED PD
    ON P.NUM_0  = PD.NUM_0
    Voilà ce que j'ai fait cela fonctionne. Comment je dois articuler pour l'ajout d'une troisième table sans parler encore de jointure externe.
    Je n'ai jamais travaillé avec ce type de jointure. Je ne sais où placer ma 3ème table et la jointure.

  6. #6
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut
    C'est bon j'ai donc retravailler ma requête comme demandé et cela me donne çà :
    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 P.BPR_0, PD.ITMREF_0, B.BPSNUM_0, IT.TSICOD_0, PD.ITMDES_0, P.INVTYP_0, PD.QTYSTU_0, PD.STU_0, P.CUR_0, PD.AMTNOTLIN_0, I.STOFCY_0, PD.ACCDAT_0, C1.STOFCY_0, C1.CSTTYP_0, C1.YEA_0, C1.VLTTOT_0, C2.VLTTOT_0, PD.NUM_0, PD.PIDLIN_0
    From PINVOICE P
    INNER JOIN PINVOICED PD
    ON P.NUM_0=PD.NUM_0
    INNER JOIN BPSUPPLIER B
    ON P.BPR_0=B.BPSNUM_0
    INNER JOIN ITMFACILIT I
    ON PD.ITMREF_0=I.ITMREF_0
    INNER JOIN ITMMASTER IT
    ON PD.ITMREF_0=IT.ITMREF_0
    INNER JOIN ITMCOST C1
    ON PD.ITMREF_0=C1.ITMREF_0
    INNER JOIN ITMCOST C2
    ON PD.ITMREF_0=C2.ITMREF_0
    And (P.BPR_0 between '{?fourdeb}' and '{?fourfin}')
    And (PD.ACCDAT_0 between {?datedeb} and {?datefin})
    And (PD.ITMREF_0 between '{?artdeb}' and '{?artfin}')
    And P.CUR_0='EUR'
    And I.STOFCY_0='LOU'
    And C1.STOFCY_0='LOU'
    And C1.CSTTYP_0=3
    And C1.YEA_0=2012
    And C2.STOFCY_0='LOU'
    And C2.CSTTYP_0=2
    And C2.YEA_0=2012
    Maintenant comment intégrer et à quel endroit intégrer ce qu'il me reste pour que cela soit pris dans ma requête même si je n'ai pas de donnée dans la table.
    Ce qu'il me reste à rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select PR.DCGVAL_1
    From PPRICLIST PR
    And PR.DCGVAL_1>0
    And (PD.ACCDAT_0 between PR.PLISTRDAT_0 and PR.PLIENDDAT_0)

  7. #7
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut
    Sachant qu'il y a deux jointures à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    And P.BPR_0=PR.PLICRI1_0
    And PD.ITMREF_0=PR.PLICRI2_0

  8. #8
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut
    Pour information j'ai tenté comme ci-dessous pour la double jointure mais çà ne fonctionne pas ligne concerné (15, 16, 17 et 18) :

    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
    Select P.BPR_0, PD.ITMREF_0, B.BPSNUM_0, IT.TSICOD_0, PD.ITMDES_0, P.INVTYP_0, PD.QTYSTU_0, PD.STU_0, P.CUR_0, PD.AMTNOTLIN_0, I.STOFCY_0, PD.ACCDAT_0, C1.STOFCY_0, C1.CSTTYP_0, C1.YEA_0, C1.VLTTOT_0, C2.VLTTOT_0, PD.NUM_0, PD.PIDLIN_0, PR.DCGVAL_1
    From PINVOICE P
    INNER JOIN PINVOICED PD
    ON P.NUM_0=PD.NUM_0
    INNER JOIN BPSUPPLIER B
    ON P.BPR_0=B.BPSNUM_0
    INNER JOIN ITMFACILIT I
    ON PD.ITMREF_0=I.ITMREF_0
    INNER JOIN ITMMASTER IT
    ON PD.ITMREF_0=IT.ITMREF_0
    INNER JOIN ITMCOST C1
    ON PD.ITMREF_0=C1.ITMREF_0
    INNER JOIN ITMCOST C2
    ON PD.ITMREF_0=C2.ITMREF_0
    LEFT OUTER JOIN PPRICLIST PR
    ON P.BPR_0=PR.PLICRI1_0
    LEFT OUTER JOIN PPRICLIST PR
    ON PD.ITMREF_0=PR.PLICRI2_0
    And (P.BPR_0 between '{?fourdeb}' and '{?fourfin}')
    And (PD.ACCDAT_0 between {?datedeb} and {?datefin})
    And (PD.ITMREF_0 between '{?artdeb}' and '{?artfin}')
    And P.CUR_0='EUR'
    And I.STOFCY_0='LOU'
    And C1.STOFCY_0='LOU'
    And C1.CSTTYP_0=3
    And C1.YEA_0=2012
    And C2.STOFCY_0='LOU'
    And C2.CSTTYP_0=2
    And C2.YEA_0=2012

  9. #9
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Remplacer votre 1er AND par un WHERE !
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  10. #10
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut
    C'est pas mieux il me met en erreur :
    "Column ambiguously defined"

  11. #11
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Vous avez 2 alias identiques !
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  12. #12
    Membre actif
    Inscrit en
    Janvier 2006
    Messages
    1 218
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 218
    Points : 257
    Points
    257
    Par défaut
    Ce que vous appelez alias c'est PPRICLIST PR qui apparait dans deux jointures ?
    Car j'ai mis çà deux fois car c'est la même table mais il y a deux jointures.

    Alors que pour les tables nomées ITMCOST C1 et ITMCOST C2, là c'était deux tables différentes.

    Pouvez-vous m'expliquer la différence ?

  13. #13
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    L'alias sert précisément a donner un "surnom" (surnommage) a une table afin de rendre la requete plus lisible, et permettre aussi de differencier les sources de données dans le cas d'une autojointure par exemple

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.MaColonne,B.MonAutreColonne
    FROM
       MaTable A 
    INNER JOIN MaTable B
    WHERE
        A.Col1 = B.Col2
    Est une autojointure (donc meme table) mais pour les différencier, j'utilise les alias A et B afin de pouvoir écrire ma condition de jointure.

    Il est évident que vous devez passer plus de temps sur le tutoriel des jointures ... Cela vous évitera de perdre du temps et approfondira vos connaissances
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2012, 11h25
  2. [SP-2010] Faire une somme sur une colonne d'une liste
    Par sebfreu dans le forum SharePoint
    Réponses: 6
    Dernier message: 19/01/2012, 11h05
  3. Réponses: 1
    Dernier message: 30/08/2011, 09h53
  4. [XL-2003] Affichage date du mois en cours sur une colonne et une ligne sur trois
    Par altra dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 10/08/2009, 07h51
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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