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 :

[A-07] Comportement bizarre avec Jointure


Sujet :

Requêtes et SQL.

  1. #1
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut [A-07] Comportement bizarre avec Jointure
    bonjour,

    je suis confronté à un probleme bizarre. Ou alors, quelque chose m'échappe!

    dans une requete composées de 2 tables et d'une vue, voici ce qu'il se passe

    je fait un groupement sur des numéro d'offres et j'obtiens X numeros d'offre.

    maintenant, à cette même requete, j'ajoute une autre table.

    si je n'ajoute aucun champs ( donc juste une jointure en fait), j'obtientjs mes X numero d'offres. Jusque là, normal je pense.
    maintenant, si j'ajoute un champ de cette table, j'obtiens X+Y numero d'offre.
    donc plus que précédemment... c'est là que j'ai du mal à comprendre pourquoi cela arrive (surtout que cela me semble impossible...)
    Quelqu'un aurait-il une idée de ce que j'oublie? ou simplement une idée?


    Merci à tous

    Mayekeul

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour Mayekeul,
    tu dis faire un regroupement, tant que tu n'ajoutes pas de nouveaux champs ton regroupement est également inchangé; dès que tu précises la sélection d'un champ tu as du l'ajouter aussi dans la clause GROUP BY de la requête.
    As-tu un champ Min(),Max(),Count(),Sum() pour effectuer un regroupement ?
    Peux-tu insérer le code SQL de ta requête qu'on puisse voir ?

  3. #3
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    Bonjou Ilank

    merci de t'intéresser à mon cas

    Cette requete est celle de base... rien à y redire me concernant

    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 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate
    FROM 
        dbo_ConsumptionVolumes 
        INNER JOIN 
            (dbo_RangeConsumptions 
                INNER JOIN qry_ECS_W_OpenClicks ON dbo_RangeConsumptions.Offers_OfferID = qry_ECS_W_OpenClicks.OfferID) 
            ON dbo_ConsumptionVolumes.RangeConsumptions_RangeConsumptionID = dbo_RangeConsumptions.RangeConsumptionID
    WHERE (((dbo_ConsumptionVolumes.cfgLoads_LoadID)=1 Or (dbo_ConsumptionVolumes.cfgLoads_LoadID)=2))
    GROUP BY 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate
    HAVING (((Sum(dbo_ConsumptionVolumes.ConsumptionVolumeValue))<18000));
    Celle-ci j'y ajoute simplement la table dbo.Formulas ... elle filtre ce que je lui demande, donc rien de particulier non plus à commenter
    les numérod'ordre sont à ce stade au nombres de 26.
    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
    SELECT 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate
    FROM 
        dbo_Formulas 
        INNER JOIN 
            (dbo_ConsumptionVolumes 
                INNER JOIN (dbo_RangeConsumptions 
                    INNER JOIN qry_ECS_W_OpenClicks ON dbo_RangeConsumptions.Offers_OfferID = qry_ECS_W_OpenClicks.OfferID) 
                ON dbo_ConsumptionVolumes.RangeConsumptions_RangeConsumptionID = dbo_RangeConsumptions.RangeConsumptionID) 
            ON dbo_Formulas.RangeConsumptions_RangeConsumptionID = dbo_RangeConsumptions.RangeConsumptionID
    WHERE (((dbo_ConsumptionVolumes.cfgLoads_LoadID)=1 Or (dbo_ConsumptionVolumes.cfgLoads_LoadID)=2))
    GROUP BY 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate
    HAVING (((Sum(dbo_ConsumptionVolumes.ConsumptionVolumeValue))<18000));
    dans cette dernière, j'ajoute un champ qui comprends qui est lui aussi regroupé, je devrais avoir a ce stade 26 numero d'ordre multiplié par le nombre d'occurence du champ ajouté ( ici 2) donc soit 52 records
    j'en obtient 62....
    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
    SELECT 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate, 
        dbo_Formulas.FormulaDealTicketPMIPB
    FROM 
        dbo_Formulas 
            INNER JOIN (dbo_ConsumptionVolumes 
                INNER JOIN (dbo_RangeConsumptions 
                    INNER JOIN qry_ECS_W_OpenClicks ON dbo_RangeConsumptions.Offers_OfferID = qry_ECS_W_OpenClicks.OfferID) 
                ON dbo_ConsumptionVolumes.RangeConsumptions_RangeConsumptionID = dbo_RangeConsumptions.RangeConsumptionID) 
            ON dbo_Formulas.RangeConsumptions_RangeConsumptionID = dbo_RangeConsumptions.RangeConsumptionID
    WHERE (((dbo_ConsumptionVolumes.cfgLoads_LoadID)=1 Or (dbo_ConsumptionVolumes.cfgLoads_LoadID)=2))
    GROUP BY 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate, 
        dbo_Formulas.FormulaDealTicketPMIPB
    HAVING (((Sum(dbo_ConsumptionVolumes.ConsumptionVolumeValue))<18000));
    Je comprendrai en avoir moins.... mais plus..... je seche!!!

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    En fait, je ne sais pas si te demander t'afficher tes requêtes était une bonne idée

    Ce n'est pas l'occurrence du champ "dbo_Formulas.FormulaDealTicketPMIPB" qui détermine le nombre d'enregitrements mais le nombre d'occurence de celui-ci "dbo_Formulas.RangeConsumptions_RangeConsumptionID", c'est ton champ de jointure. Ici, tu demandes de te renvoyer le champ Ticket à chaque correspondance ConsumptionID.
    Essaie en ajoutant dans clause GROUP BY de la seconde requête le champ FormulaDealTicketPMIPB. tu devrais avoir le même nombre d'enregistrements que dans la troisième.
    Maintenant, essaie peut-être de contruire la clause FROM et les jointures à partir de la requête qry_ECS_W_OpenClicks. C'est elle qui contient les enregistrements à filtrer.

    Je ne suis vraiment pas sûr mais une requête à tester :
    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 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate,
        dbo_Formulas.FormulaDealTicketPMIPB
    FROM
        qry_ECS_W_OpenClicks
        INNER JOIN
            (dbo_RangeConsumptions
                INNER JOIN
                    (dbo_Consumptionsvolumes
                       INNER JOIN dbo_Formulas ON dbo_Formulas.RangeConsumptions_RangeConsumptionID = dbo_ConsumptionVolumes.RangeConsumptions_RangeConsumptionID)
                    ON dbo_ConsumptionVolumes.RangeConsumptions_RangeConsumptionID = dbo_RangeConsumptions.RangeConsumptionID)
            ON dbo_RangeConsumptions.Offers_OfferID = qry_ECS_W_OpenClicks.OfferID)
    WHERE (((dbo_ConsumptionVolumes.cfgLoads_LoadID)=1 Or (dbo_ConsumptionVolumes.cfgLoads_LoadID)=2))
    GROUP BY 
        qry_ECS_W_OpenClicks.OfferID, 
        qry_ECS_W_OpenClicks.OfferName, 
        qry_ECS_W_OpenClicks.OfferSignDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate, 
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate,
        dbo_Formulas.FormulaDealTicketPMIPB     	     	
    HAVING (((Sum(dbo_ConsumptionVolumes.ConsumptionVolumeValue))<18000));

  5. #5
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    helas,

    non, ça ne donne rien de mieux
    la jointure que tu indiques est identique (mais exprimée différemment certes )

    le souci, n'est pas la jointure (pas que je sache, la preuve en est que si je n'introduit pas de champs, le nombre d'offre reste identique), mais simplement de savoir comment est-ce possible que la requete me renvoie plus de numéro d'offres qu'au départ!

    soit je n'y comprends plus rien, soit je suis complement fou!

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Tu as 10 enregistrements de plus que ce que tu attends; mais est-ce que tous les champs sont renseignés ? As-tu des doublons ?

    essaie :
    sans GROUP BY
    avec SELECT DISTINCT (ou SELECT DISTINCTROW).

    Ne tiens pas compte de ce message finalement; je n'ai pas fait gaffe au HAVING.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour mayekeul keul,
    peux-tu indiquer les relations entre les tables ?
    Ca me chiffonne ton histoire, j'arrive pas à savoir si c'est normal ou si ta requête pose problème.
    Dans un premier temps peux-tu procéder par étape :
    d'abord faire la requête sur la dbo_consumptionvolumes pour connaître le nombre max de lignes retournées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT RangeConsumptions_RangeConsumptionID 
    FROM dbo_ConsumptionVolumes
    WHERE cfgLoads_LoadID=1 or cfgLoads_LoadID=2
    GROUP BY RangeConsumptions_RangeConsumptionID 
    HAVING Sum(ConsumptionVolumeValue)<18000

  8. #8
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    bonjour ilank,
    ça me chiffonne aussi lol mais grrrr

    les relations entre les tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dbo_RangeConsumptions.Offers_OfferID = qry_ECS_W_OpenClicks.OfferID
    dbo_ConsumptionVolumes.RangeConsumptions_RangeConsumptionID = dbo_RangeConsumptions.RangeConsumptionID
    dbo_Formulas.RangeConsumptions_RangeConsumptionID = dbo_ConsumptionVolumes.RangeConsumptions_RangeConsumptionID
    alors, le nombre de lignes retournées!!
    est 492

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    En fait, je voulais savoir le type de relations 1 à n.
    492 enregistrements ?! Tu t'en sors pas mal avec 62 finalement.
    Bon maintenant, tu ajoutes la table dbo_range.... dans le code SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Offers_OfferID
    FROM dbo_RangeConumptions
    WHERE RangeConsumptionID IN 
    (la requête précédente)
    puis tu retransformes la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT OfferID,SgnDate,....
    FROM qry_ECS_W_OpenClicks
    INNER JOIN (la requête du dessus) As Range
    ON Range.Offers_OfferID=...

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    bonjour mayekeul,
    j'y vois un peu mieux. Tes deux requêtes ne font pas du tout la même chose, le résultat est donc normal.
    Les deux premières testent la somme sur toute l'offre, la troisième teste la somme de chaque ligne.
    Concernant, les tickets ce n'est pas 52 que tu dois obtenir mais 2*le nombre de lignes par offre.

    Essaie ceci :
    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
    SELECT
        qry_ECS_W_OpenClicks.OfferID,
        qry_ECS_W_OpenClicks.OfferName,
        qry_ECS_W_OpenClicks.OfferSignDate,
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate,
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate,
        dbo_Formulas.FormulaDealTicketPMIPB
    FROM qry_ECS_W_OpenClicks
         INNER JOIN
    	(dbo_RangeConsumptions INNER JOIN dbo_Formulas
    	 ON dbo_Formulas.RangeConsumptions_RangeConsumptionID=dbo_RangeConsumptions.RangeconsumptionID
    	)
            ON dbo_RangeConsumptions.Offers_OfferID=qry_ECS_W_OpenClicks.OfferID
    WHERE dbo_RangeConsumptions.Offers_OfferID IN
         (SELECT RC.Offers_OfferID
           FROM dbo_RangeConsumptions As RC
           INNER JOIN dbo_ConsumptionVolumes As CV ON RC.RangeConsumptionID=CV.RangeConsumptions_RangeConsumptionID
           WHERE CV.cfgLoads_LoadID=1 Or CV.cfgLoads_LoadID=2
           GROUP BY RC.Offers_OfferID
           HAVING Sum(CV.ConsumptionVolumes)<18000
         )
    GROUP BY
        qry_ECS_W_OpenClicks.OfferID,
        qry_ECS_W_OpenClicks.OfferName,
        qry_ECS_W_OpenClicks.OfferSignDate,
        qry_ECS_W_OpenClicks.OfferDeliveryStartDate,
        qry_ECS_W_OpenClicks.OfferDeliveryEndDate,
        dbo_Formulas.FormulaDealTicketPMIPB;

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

Discussions similaires

  1. comportement bizarre avec js
    Par Gr@nd@x dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 17/01/2011, 16h36
  2. Comportement bizarre avec un pointeur
    Par esteban dans le forum Langage
    Réponses: 7
    Dernier message: 15/07/2010, 14h05
  3. [XSL-FO] comportement bizarre avec tableau
    Par titouille dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 25/11/2009, 12h47
  4. Comportement bizarre avec le SQL a la carte
    Par fatatov dans le forum Deski
    Réponses: 2
    Dernier message: 11/07/2008, 16h47
  5. [TRANSAQ SQL] INSERT comportement bizarre avec les REAL
    Par argyronet dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/12/2005, 11h47

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