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 :

Requête avec jointures externes


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Points : 40
    Points
    40
    Par défaut Requête avec jointures externes
    Bonjour,

    Voila ma requête :
    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
    45
    46
    47
    48
    49
    50
    51
    select result.libelle, ISNULL(sum(result.nbReservations3), 0) as delai3, ISNULL(sum(result.nbReservations7),0) as delai7, ISNULL(SUM (result.nbReservations14),0) as delai14,result.Code 
          from sejour.NatureSejour nat 
          leftjoin
          (
          select n.libelle as libelle, ISNULL(COUNT(i.ID_Inscription),0) as nbReservations3, '' as nbReservations7,'' as nbReservations14, n.Code as code
         from i
          inner join  p on p.ID_Periode = i.ID_Periode
          inner join a on art.ID_Article = p.ID_Article
          inner join s sej on sej.ID_Sejour = a.ID_Sejour
          inner join NS nat on nat.ID_NatureSejour = s.ID_NatureSejour
          INNER JOIN u ON u.ID_Utilisateur = i.ID_Utilisateur
          where i.ID_TypeInscription = 2 
          and DATEDIFF(DD ,GETDATE(),i.DateEcheance) between 0 and 3 
          and i.DateAnnulation is null 
          AND u.ID_Region = 2
          group by libelle,code
     
          union
     
          select n.libelle as libelle,'' as nbReservations3, ISNULL(COUNT(i.ID_Inscription),0) as nbReservations7, '' as nbReservations14, n.Code as code
          from i
          inner join  p on p.ID_Periode = i.ID_Periode
          inner join a on art.ID_Article = p.ID_Article
          inner join s sej on sej.ID_Sejour = a.ID_Sejour
          inner join NS nat on nat.ID_NatureSejour = s.ID_NatureSejour
          INNER JOIN u ON u.ID_Utilisateur = i.ID_Utilisateur
          where i.ID_TypeInscription = 2 
          and DATEDIFF(DD ,GETDATE(),i.DateEcheance) between 0 and 7 
          and i.DateAnnulation is NULL
        AND u.ID_Region = 2
          group by libelle,code
     
          union
     
          select n.libelle as libelle,'' as nbReservations3, '' as nbReservations7, ISNULL(COUNT(i.ID_Inscription),0) as nbReservations14, n.Code as code
          from i
          inner join  p on p.ID_Periode = i.ID_Periode
          inner join a on art.ID_Article = p.ID_Article
          inner join s sej on sej.ID_Sejour = a.ID_Sejour
          inner join NS nat on nat.ID_NatureSejour = s.ID_NatureSejour
          INNER JOIN u ON u.ID_Utilisateur = i.ID_Utilisateur
          where i.ID_TypeInscription = 2 
          and DATEDIFF(DD ,GETDATE(),i.DateEcheance) between 0 and 14 
          and i.DateAnnulation is NULL
          AND u.ID_Region = 2
          group by libelle,code
     
          ) 
          as result on nat.libelle = result.libelle
     
          group by result.libelle,result.code
    Qui donne le resultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    libelle	delai3	delai7	delai14	
    NULL	0	0	0	
    S2	0	0	2	
    S3	10	39	48
    J'aimerai qu'au lieu de m'afficher "NULL" dans la première colonne qu'il m'affiche le libelle S1 à la place.

    Je n'y arrive pas ça fait deux jours que je suis dessus si vous pouviez m'aider ce serait sympa !

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Plusieurs choses ne vont pas dans votre requête.

    Déjà vous faites plus ou moins trois fois la même opération, je vais vous montrer comment la synthétiser en une.

    Au dernier niveau, vous faites une jointure externe avec la table sejour.NatureSejour, mais vous n'utilisez celle-ci nullement dans le résultat final.

    Quel est donc l'intérêt de cette jointure ?

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Comme requête de base, essayez celle-ci :
    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
    SELECT
        n.libelle,
        n.Code,
        count(case when i.DateEcheance BETWEEN GETDATE() AND GETDATE() + 3 then 1 end) AS nbReservations3,
        count(case when i.DateEcheance BETWEEN GETDATE() AND GETDATE() + 7 then 1 end) AS nbReservations7,
        count(*) AS nbReservations14
    FROM
        i
        INNER JOIN p
          ON p.ID_Periode = i.ID_Periode
        INNER JOIN a
          ON art.ID_Article = p.ID_Article
        INNER JOIN s sej
          ON sej.ID_Sejour = a.ID_Sejour
        INNER JOIN NS nat
          ON nat.ID_NatureSejour = s.ID_NatureSejour
        INNER JOIN u
          ON u.ID_Utilisateur = i.ID_Utilisateur
    WHERE
        i.ID_TypeInscription = 2 
    AND i.DateEcheance BETWEEN GETDATE() AND GETDATE() + 14
    AND i.DateAnnulation IS NULL 
    AND u.ID_Region = 2
    GROUP BY
        n.libelle,
        n.Code;

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Points : 40
    Points
    40
    Par défaut
    Merci de m'avoir répondu !

    Si je l'utilise pour afficher le libelle n.libelle

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Non, je parle au plus haut niveau.
    Vous utilisez le libellé de "result", regardez votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT result.libelle,
             isnull(sum(result.nbReservations3) ,0) AS delai3,
             isnull(sum(result.nbReservations7) ,0) AS delai7,
             isnull(sum(result.nbReservations14),0) AS delai14,
             result.code 
        FROM sejour.NatureSejour as nat 
             left outer join ( .... ) AS result
               ON nat.libelle = result.libelle
    GROUP BY result.libelle, result.code;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Merci pour votre aide !

    Effectivement on peut se passer de la jointure.
    Est ce que d'apres vous on peut afficher le troisieme libelle on lieu de "null"

  7. #7
    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
    préferez le COALESCE a la place du ISNULL
    et utilisez plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(COALESCE(macolone,0))
    plutot que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(sum(macolone),0)
    Cela vous pourra vous éviter quelques surprises

    Pour avoir votre 3eme libelle a la place de null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE (libelle,Libelle3emeColone)
    J'espere vous avoir été utile

    cordialement
    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)

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Citation Envoyé par Yanika_bzh Voir le message
    utilisez plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(COALESCE(macolone,0))
    plutot que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(sum(macolone),0)
    Il va falloir argumenter pour me convaincre !

  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
    Pas de pb !!
    Experience vecue sur du ORACLE (7.3 c'est vieux ok) et Sybase 12.5.2

    NULL + valeur = NULL et non valeur
    Sum (Null) = null et non 0

    et tout ca parait plus que logique.

    Est ce assez convaincant ?
    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
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Et bien non
    Je vous prouve le contraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select 1 + null;
     
    num
    -----------
    NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select sum(sr.num)
    from
    (
    select 1 as num union all
    select null     
    ) sr;
     
    num
    -----------
    1

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Sur db2 V5R4 ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select 1.2 + CAST (NULL AS DECIMAL) from SYSIBM.SYSDUMMY1
    me retourne NULL.

    Par contre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with tmp(nb) as (
    select 1.2 from SYSIBM.SYSDUMMY1
    union all
    select CAST (NULL AS DECIMAL) from SYSIBM.SYSDUMMY1
    )
     
    select sum(nb) from tmp;
    Me retourne bien 1.2

  12. #12
    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
    Et moi je peux vous confirmer que l'on a du revisiter nos requetes lors d'une migration ORACLE a cause de cela...

    Je faisais juste une mise en garde, je n'ai pas dit que c'etait la norme officielle d'utilisation.
    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)

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Je n'ai plus d'Oracle 7.3.4 sous la main pour tester celà mais j'ai un Sybase 12, même résultat.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos reponses !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE (libelle,Libelle3emeColone)
    Je dois l ecrire a quel niveau ?
    Je debute

Discussions similaires

  1. Requête avec jointure externe
    Par Neuromancien2 dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/04/2008, 00h47
  2. Requête avec jointure externe complexe
    Par dpin33 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/03/2008, 13h41
  3. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 16h50
  4. requête avec jointure externe
    Par GMI3 dans le forum Oracle
    Réponses: 8
    Dernier message: 12/04/2006, 10h29
  5. Requête avec jointure externe
    Par claralavraie dans le forum Langage SQL
    Réponses: 8
    Dernier message: 02/02/2006, 08h34

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