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 :

Jointure avec résultat group by


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Homme Profil pro
    Indépendant X3 et SQL server
    Inscrit en
    Juillet 2006
    Messages
    865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Indépendant X3 et SQL server
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2006
    Messages : 865
    Points : 1 091
    Points
    1 091
    Par défaut Jointure avec résultat group by
    bonjour a tous (toutes peut être)

    J'ai eu beau chercher dans les pages sqlpro je coince.

    J'ai 3 tables : liste d'article, entête facture et lignes factures

    Je dois liste les articles avec leur quantité vendue sur une période, mais avec un zéro si l'article n'a pas été vendu.

    il s'agit donc d'une jointure gauche avec la liste des articles mais à la suite du join je ne sais mettre qu'un nom de table, je ne sais pas mettre une sous requête.

    Le problème aussi est que je ne peux pas faire de vue car la période est paramétrable par un utilisateur via une interface.

  2. #2
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Si tu fais quelque chose comme ça, ça ne marche pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM produit P
    LEFT OUTER JOIN factureEntete FE WITH (NOLOCK) ON FE.produitId = P.produitId
    LEFT OUTER JOIN factureLigne FL WIT (NOLOCK) ON FL.factureEnteteId = FE.factureEnteteId
    WHERE P.produitDateVente < @dateutilisateur AND P.produitDateVente > @dateutilisateur
    ORDER BY P.produitDateVente

  3. #3
    Membre éprouvé
    Homme Profil pro
    Indépendant X3 et SQL server
    Inscrit en
    Juillet 2006
    Messages
    865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Indépendant X3 et SQL server
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2006
    Messages : 865
    Points : 1 091
    Points
    1 091
    Par défaut
    Non car ma requête de calcul est du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select lig.Ref,
           Sum(Montant)
     
    from Factures lig, facture ent
    where
        (ent.NUM_0 = lig.NUM_0)
    and (ent.CREDAT_0 >= %1%)
    AND (ent.CREDAT_0 <= %1%)
    group by lig.Ref
    order by lig.Ref
    et qu'en résultat je veux voir :

    Ref, Montant
    001 12,50
    002 0 (le 002 n' pas eu de ventes)
    ...

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 051
    Points
    34 051
    Billets dans le blog
    14
    Par défaut
    Je suppose que lig.Ref représente la référence de l'article et est une clé étrangère faisant référence à l'identifiant de l'article dans la table des articles ?

    Si un article n'a pas été vendu, il ne va pas figurer dans la table des lignes de factures. Il faut donc faire une jointure externe de la table des articles vers la table des lignes de factures.

    La condition sur la CREDAT_0 est bizarre ! C'est quoi ce %1% ? Si CREDAT_0 doit être à la fois >= et <= à une variable représentée par %1%, autant dire tout de suite que CREDAT_0 doit être = à %1%.
    Si vous voulez tester une plage de dates, préférez la fonction BETWEEN premièredate AND dernièredate, les bornes étant incluses dans l'intervalle.

    Et en écrivant les jointures avec la syntaxe normalisée depuis 1992, c'est encore mieux !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT lig.Ref,
           Sum(Montant)
    FROM Article art
    LEFT OUTER JOIN Factures lig ON art.Ref = lig.Ref
      INNER JOIN facture ent ON ent.NUM_0 = lig.NUM_0
    WHERE ent.CREDAT_0 >= %1% 
      AND ent.CREDAT_0 <= %1%
    GROUP BY lig.Ref
    ORDER BY lig.Ref

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Il faut selectionner art.ref au lieu de lig.ref, et utiliser coalesce si vous voulez obtenir 0 à la place de NULL pour les articles invendus.
    Aussi, il faut utiliser une jointure externe pour la seconde jointure également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT art.Ref,
           coalesce(Sum(ent.Montant),0) as Montant
    FROM Article art
    LEFT OUTER JOIN Factures lig ON art.Ref = lig.Ref
    LEFT OUTER JOIN facture ent ON ent.NUM_0 = lig.NUM_0
    WHERE ent.CREDAT_0 >= %1% 
      AND ent.CREDAT_0 <= %1%
    GROUP BY art.Ref
    ORDER BY art.Ref
    Au passage, il n'est ni pratique ni intuitif d'avoir une table 'factures' et une autre 'facture'.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 051
    Points
    34 051
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Il faut selectionner art.ref au lieu de lig.ref, et utiliser coalesce si vous voulez obtenir 0 à la place de NULL pour les articles invendus.
    Aussi, il faut utiliser une jointure externe pour la seconde jointure également
    Exact ! Je ne suis pas très en forme aujourd'hui.

    Au passage, il n'est ni pratique ni intuitif d'avoir une table 'factures' et une autre 'facture'.
    +1.
    J'y avais pensé aussi et ne l'ai pas signalé.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 886
    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 886
    Points : 53 092
    Points
    53 092
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Et en écrivant les jointures avec la syntaxe normalisée depuis 1992, c'est encore mieux !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT lig.Ref,
           Sum(Montant)
    FROM Article art
    LEFT OUTER JOIN Factures lig ON art.Ref = lig.Ref
      INNER JOIN facture ent ON ent.NUM_0 = lig.NUM_0
    WHERE ent.CREDAT_0 >= %1% 
      AND ent.CREDAT_0 <= %1%
    GROUP BY lig.Ref
    ORDER BY lig.Ref
    Ou la la philippe j'ai connu mieux !!!!

    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
    SELECT art.ref,
           Sum(Montant)
    FROM   Article AS art
           LEFT OUTER JOIN Factures AS lig 
                ON art.Ref = lig.Ref
           LEFT OUTER JOIN facture AS ent --> pas inner join sinon tu perd tous les articles non commandés ! 
                ON ent.NUM_0 = lig.NUM_0 
    /* pas en WHERE sinon idem... metre dans le JOIN
    WHERE ent.CREDAT_0 >= %1% 
      AND ent.CREDAT_0 <= %1%
    */
                   AND ent.CREDAT_0 >= %1% 
                   AND ent.CREDAT_0 <= %1%   
    GROUP BY lig.Ref
    ORDER BY lig.Ref
    A +

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 051
    Points
    34 051
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ou la la philippe j'ai connu mieux !!!!
    Ouais bon ça va ! J'ai dit que j'étais pas en forme aujourd'hui !
    Dent de sagesse arrachée hier soir + rhume. J'ai le droit à un moment de faiblesse quand même !
    Piske c'est comme ça je ne répondrai plus à aucun message aujourd'hui ! Na !

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

Discussions similaires

  1. jointure avec résultat erroné
    Par IA_joanie dans le forum Cognos
    Réponses: 2
    Dernier message: 29/12/2014, 11h41
  2. Double jointure avec double group by
    Par annebe dans le forum DB2
    Réponses: 0
    Dernier message: 28/01/2013, 14h52
  3. jointure avec résultat sur 3 colonnes
    Par snorky94 dans le forum Requêtes
    Réponses: 22
    Dernier message: 19/10/2012, 09h14
  4. Jointures avec du multi group by
    Par Magnat dans le forum Requêtes
    Réponses: 6
    Dernier message: 26/01/2010, 16h13
  5. Jointure avec plusieurs résultats
    Par kemenaran dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/12/2005, 23h21

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