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

Requêtes et SQL. Discussion :

Problème de jointure


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut Problème de jointure
    Bonjour,

    Soit la requête ci-dessous qui fonctionne, mais filtre trop (à cause de la clause INNER JOIN), j'aimerai la remplacer par FULL OUTER JOIN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT CAmarqueParPorte.idStore, SUM(CAmarqueParPorte.salesNetAmount) AS 2006, sum(CAmarqueParPorte_1.salesNetAmount) AS 2007
    FROM Fournisseur 
    INNER JOIN (CAmarqueParPorte INNER JOIN CAmarqueParPorte AS CAmarqueParPorte_1 ON CAmarqueParPorte.idStore = CAmarqueParPorte_1.idStore) 
    ON (Fournisseur.idMarque = CAmarqueParPorte.idBrand) AND (Fournisseur.idMarque = CAmarqueParPorte_1.idBrand)
    GROUP BY CAmarqueParPorte.idStore
    Hélas il ne suffit pas de remplacer INNER par FULL OUTER. En effet j'ai vu dans la FAQ du site que la syntaxe était :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Select ...
    From T1
    Left Outer Join T2
    On...
    Union
    Select ...
    From T2
    Left Outer Join T1
    On...
    Le problème est que j'arrive pas du tout à adapter ma requête à la syntaxe, je débute dans le SQL et j'ai encore beaucoup de mal avec les différents concepts des jointures.

    Deja j'ai remplacé les INNER JOIN par les LEFT JOIN et il me refuse "expression de jointure non supportés".

    Quelqu'un voit t'il comment je pourrais transformer ma requête avec l'équivalence du FULL OUTER ?

    D'avance un grand merci !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Mathusalem m'a grandement aidé dans la rubrique "langage sql" du forum, voici avec son aide la requête que j'ai pu faire

    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
     
    SELECT
    p1.idStore, 
    SUM(p1.salesNetAmount) AS 2006, 
    sum(p2.salesNetAmount) AS 2007
    FROM Fournisseur  AS f
    LEFT OUTER JOIN CAmarqueParPorte  AS p1
              ON f.idMarque = p1.idBrand
              AND f.idMarque = p2.idBrand
    UNION
    SELECT p1.idStore, 
    SUM(p1.salesNetAmount) AS 2006, 
    sum(p2.salesNetAmount) AS 2007
    FROM Fournisseur  AS f
    LEFT OUTER JOIN CAmarqueParPorte AS p2
            ON p1.idStore = p2.idStore
            AND f.idMarque = p2.idBrand
    GROUP BY p1.idStore
    Je pense que je suis pas très loin, mais là j'ai le message "erreur de syntaxe dans l'instruction JOIN" en faite c'est mon AND qui déconne je pense, mais comment palier à ça ?

    Merchii et bonne ap' !!

  3. #3
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Est-ce que p2 est visible dans la première requête ? J'en doute

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Alors là je sais pas du tout, j'y connais vraiment pas grand chose sur le fonctionnement du sql, en plus on apprend que les jointures des année 86 (jointure dans le WHERE) en cours

    En faite plus je cherche et plus j'ai l'impression qu'elle est impossible non ??

  5. #5
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par julie75 Voir le message
    Alors là je sais pas du tout, j'y connais vraiment pas grand chose sur le fonctionnement du sql, en plus on apprend que les jointures des année 86 (jointure dans le WHERE) en cours

    En faite plus je cherche et plus j'ai l'impression qu'elle est impossible non ??
    Pourquoi tu fais une union ? Apparemment, tu peux tout mettre dans une seule requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CAPP1.IdStore, sum(CAPP1.SalesNetAmount) as 2006, sum(CAPP2.SalesNetAmount) as 2007
    FROM Fournisseur F 
    LEFT OUTER JOIN (CAmarqueParPorte CAPP1 
                     LEFT OUTER JOIN CAmarqueParPorte CAPP2 
                     ON CAPP1.IdStore = CAPP2.IdStore) 
    ON (F.IdMarque = CAPP1.IdBrand AND F.IdMarque = CAPP2.IdBrand)
    GROUP BY CAPP1.IdStore;

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Merci beaucoup AL1986 pour ton soutien, j'en ai bien besoin, cette requête commence à m'exaspéré !! :d

    Quand j'exécute ta requête qui me parait logique j'ai le message "Expression de jointure non supporté" et ça me surligne le second ON à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON (F.IdMarque = CAPP1.idBrand AND F.IdMarque = CAPP2.idBrand)
    On doit pas pouvoir mettre de AND dans un ON je pense, non ?

  7. #7
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Et si tu enlèves le AND et que tu ne laisses q'un des deux critères, Que se passe-t-il ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Il se passe que la lumière des 3ème toilettes s'éteinds à la compilation lol. Non je plaisante, j'ai retiré le AND et là au moins ça compile (ça fait plaisir, tellement marre d'avoir ces messages d'erreurs) mais ça fait un produit cartésien (je suis pas sur de la définition de produit cartésien donc à prendre à la légère )

    En gros, au lieu d'avoir 30 000 comme résultat pour le premier idstore pour l'année 2006 j'ai 865 000.

    Pour info voici ce que je rajoute dans la clause where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WHERE CAPP1.annee = "2006"
    AND CAPP2.annee = "2007"
    AND CAPP1.mois = "01"
    AND CAPP2.mois = "01"
    C'est vrai que je l'ai pas dit avant, mais ma requete doit sortir le chiffre d'affaire (salesNetAmount) de chaque Magasin (idStore) pour le mois de janvier en 2006 et 2007.

    Bon bah si ma requête tourne pas avant ce soir je me suicide au yahourt périmé je vous préviens !!! Aller je retourne m'énerver dessus

  9. #9
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par julie75 Voir le message
    En gros, au lieu d'avoir 30 000 comme résultat pour le premier idstore pour l'année 2006 j'ai 865 000.
    Que représente exctement le 865000 ? est-ce la somme de tous les chiffres d'affaires ? ...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Voici le contenu de ma table CAmarqueParPorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    idStore	idBrand	annee	mois	salesNetAmount
    01401	030	2005	10	369,2901401	030	2005	11	896,1301401	030	2005	12	4 149,9401401	030	2006	01	989,3001401	030	2006	02	1 383,49 €
    ...
    Et voici ce que donne le résultat de la requête sans les SUM() et le group by afin de voir quelles valeurs la requetes aditionne :

    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
     
    IdStore	2006	2007
    01401	2 089,63400,0401401	186,96400,0401401	59,58400,0401401	1 406,06400,0401401	2 518,82400,0401401	748,09400,0401401	229,53400,0401401	67,05400,0401401	1 221,20400,0401401	608,19400,0401401	2 297,83400,0401401	120,36400,04 €
    ....
    01401	469,54400,0401401	97,50400,0401401	2 089,6353,5601401	186,9653,56 €
    ....
    Je vois ce que la requête fait mais je peux pas l'expliquer

  11. #11
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Si tu exécutes cette requête (que pour 2006):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CAPP1.IdStore, sum(CAPP1.SalesNetAmount) AS 2006,
    FROM Fournisseur F and CAmarqueParPorte CAPP1 
    where F.IdMarque = CAPP1.IdBrand
    and CAPP1.annee = "2006"
    AND CAPP1.mois = "01"
    GROUP BY CAPP1.IdStore;
    Citation Envoyé par julie75
    C'est vrai que je l'ai pas dit avant, mais ma requete doit sortir le chiffre d'affaire (salesNetAmount) de chaque Magasin (idStore) pour le mois de janvier en 2006 et 2007.
    A quoi sert le sum dans ce cas ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Le sum sert à faire la somme (sans blague ! ) des lignes dont l'année est 2006 et le mois est 01 car il y'a plusieurs idBrand par idStore donc plusieurs ligne par idStore.

    La requête fonctionne mais me sort le même résultat que ma toute première requête, elle filtre trop.

    Si un idStore n'a pas de SalesNetAmount pour un idBrand en janvier 2006 mais qu'il en à en janvier 2007 alors le montant de 2007 ne sera pas ajouté à la somme totale de janvier 2007.

    Bonjour la migraine pour comprendre ce que j'ai dit !!

  13. #13
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par julie75 Voir le message
    Si un idStore n'a pas de SalesNetAmount pour un idBrand en janvier 2006 mais qu'il en à en janvier 2007 alors le montant de 2007 ne sera pas ajouté à la somme totale de janvier 2007.
    Pourquoi ? Dans la table fournisseur, tu n'as que les idmarque correspondant aux idbrand 2006 ?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Non, dans fournisseur j'ai juste idMarque et libMarque.

    Je fais une jointure sur cette table car ça évite de faire un produit cartésien

  15. #15
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Ce que je ne comprends pas, c'est pourquoi les resultats concernant 2007 dépendraient-ils de ceux de 2006 ?
    Si tu ne joins pas sur fournisseur, cela change-t-il qqch ?
    Sinon essaie en mettant les conditions sous un having :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CAPP1.IdStore, sum(CAPP1.SalesNetAmount) AS 2006,
    FROM Fournisseur F AND CAmarqueParPorte CAPP1 
    WHERE F.IdMarque = CAPP1.IdBrand
    GROUP BY CAPP1.IdStore
    HAVING CAPP1.annee = "2006"
    AND CAPP1.mois = "01";

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par AL1986 Voir le message
    Ce que je ne comprends pas, c'est pourquoi les resultats concernant 2007 dépendraient-ils de ceux de 2006 ?
    Citation Envoyé par moi
    Si un idStore n'a pas de SalesNetAmount pour un idBrand en janvier 2006 mais qu'il en à en janvier 2007 alors le montant de 2007 ne sera pas ajouté à la somme totale de janvier 2007.
    Enfin je pense que c'est l'explication sinon je vois pas pourquoi la requête filtre des lignes comme ça...

    Sinon ta requete ne fonctionne guère (je comprends pas d'ailleurs) j'ai le droit à ce splendide message fort sympatique : "Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée 'CAPP1.annee = '2006' AND CAPP1.mois='01' comme une partie de la fonction d'agrégat" nanani nanana... Tu m'énerves Access !!

  17. #17
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par julie75 Voir le message
    Sinon ta requete ne fonctionne guère (je comprends pas d'ailleurs) j'ai le droit à ce splendide message fort sympatique : "Vous avez essayé d'exécuter une requête ne comprenant pas l'expression spécifiée 'CAPP1.annee = '2006' AND CAPP1.mois='01' comme une partie de la fonction d'agrégat" nanani nanana... Tu m'énerves Access !!
    Je n'ai jamais utilisé ACCESS. Il a l'air assez cool. Refuser le having

  18. #18
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    je passerai plutôt par une requête d'analyse croisée compte-tenu de la présentation des résultats que vous souhaitez obtenir.

    cordialement,

    Philippe

  19. #19
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par philben Voir le message
    je passerai plutôt par une requête d'analyse croisée
    Qu'est-ce qu'une requête d'analyse croisée ?

  20. #20
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    Qu'est-ce qu'une requête d'analyse croisée ?
    En gros, c'est une requête qui se sert d'un champ ou d'une expression en pivot pour générer des colonnes (ici, on génère les colonnes janvier 2006 et janvier 2007 qui contiendront la somme correspondante de SalesNetAmount des idBrand pour chaque idStore).

    Voici ce que ça donnerait si j'ai bien compris le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TRANSFORM Sum(CAmarqueParPorte.SalesNetAmount) AS SUMSalesNetAmount
    SELECT CAmarqueParPorte.idStore
    FROM CAmarqueParPorte
    WHERE [Mois]="01" And ([Annee]="2006" Or [Annee]="2007")
    GROUP BY CAmarqueParPorte.idStore
    PIVOT [Mois] & "/" & [Annee] In ("01/2006","01/2007");
    On peut obtenir le même résultat avec une requête sélection mais ça nécessite à mon avis des sous-requêtes ou l'utilisation de la fonction DSum().

    cordialement,

    philippe

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de jointure de tables
    Par AurelBUD dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2005, 17h27
  2. Probléme de jointure
    Par Ajrarn dans le forum Langage SQL
    Réponses: 14
    Dernier message: 24/02/2005, 15h57
  3. Vraisemblable problème de jointure
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 16h34
  4. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 22h15
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 12h27

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