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

SQL Oracle Discussion :

Somme multipliée par deux lors d'une jointure


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut Somme multipliée par deux lors d'une jointure
    Bonjour,

    J'ai un problème de requête SQL que je n'arrive pas à résoudre.

    J'ai une vue contenant les champs:
    Qté_livrée Année_liv Code_client
    1.05 2008 001
    2.85 2009 002

    Et j'ai une table contenant les champs:
    Code_client1 Code_client2
    00 1
    00 2

    Mon problème est le suivant:

    Quand je fais le sql suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(Qté_livrée) from Table1 where Code_client = '001'
    Je tombe sur 1.05

    Mais quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT SUM(Qté_livrée) 
    FROM
      Table1,
      Table2
    WHERE
        (Table1.Code_client=Table2.Code_client1||Table2.Code_client2)
    AND (Table1.Code_client1||Table2.Code_client2=  '001' )
    Je tombe sur 2.1 ! => La quantité livrée est multipliée par 2 !

    Comment faire pour résoudre ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Ta requête n'est pas très correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM(Qté_livrée)
    FROM Table1, Table2
    WHERE Table1.Code_client = CONCAT(Table2.Code_client1,Table2.Code_client2)
    AND Table1.Code_client='001'
    Tu as des () en trop, des = de trop...

  3. #3
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut
    Tu as raison, je l'ai corrigé maintenant. C'était juste un problème de mauvais copier/coller quand j'ai posté mon message dans le forum.... Désolée !

  4. #4
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Que donne la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Code_client, CONCAT(Table2.Code_client1,Table2.Code_client2), SUM(Qté_livrée)
    FROM Table1, Table2
    WHERE Table1.Code_client = CONCAT(Table2.Code_client1,Table2.Code_client2)
    GROUP BY Code_client, CONCAT(Table2.Code_client1,Table2.Code_client2)

  5. #5
    Inactif  

    Homme Profil pro
    Freelance EURL / Business Intelligence ETL
    Inscrit en
    Avril 2005
    Messages
    5 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance EURL / Business Intelligence ETL
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2005
    Messages : 5 878
    Billets dans le blog
    3
    Par défaut
    Je n'arrive pas à reproduire l'erreur, j'ai le bon résultat.

    Es-tu sûre que tu n'as pas rentré deux fois ton jeu de données dans l'une ou l'autre des tables ? Typiquement quand lors d'une jointure le résultat est doublé (somme, count...) c'est simplement parce qu'il y a... des doublons dans l'une des tables, et donc un produit cartésien.
    - So.... what exactly is preventing us from doing this?
    - Geometry.
    - Just ignore it !!
    ****
    "The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
    ***
    Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019

  6. #6
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Citation Envoyé par Glutinus Voir le message
    Je n'arrive pas à reproduire l'erreur, j'ai le bon résultat.

    Es-tu sûre que tu n'as pas rentré deux fois ton jeu de données dans l'une ou l'autre des tables ? Typiquement quand lors d'une jointure le résultat est doublé (somme, count...) c'est simplement parce qu'il y a... des doublons dans l'une des tables, et donc un produit cartésien.
    Ou qu'il manque une condition de jointure !!!!!

  7. #7
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut
    Merci pour vos réponses.

    Je vais ajouter plus de précisions si ça peut aider ...

    Mes deux tables (une vue et une table) sont utilisées dans un univers BO avec la jointure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vue.Code_client=Table.Code_client1||Table.Code_client2
    Quand je veux créer un rapport BO avec les Objets de ma vue uniquement :
    Qté_livrée et Code_client = '001' , j'ai le résultat 1.05.

    Si j'ajoute un objet provenant de ma table, par exemple le Nom_client, j'ai la quantité livrée multipliée par 2!

    Ci-joint un exemple de vraies données de ma vue.

    Je me dis que c'est ma jointure qui pose problème ! mais je ne vois pas comment le résoudre!
    Images attachées Images attachées  

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

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

    La modélisation me semble très douteuse.

    Logiquement dans votre Table2 vous devriez avoir une FK qui référence le Code_client de la Table1.

    Bref, quand vous executez cette requête qu'avez-vous comme résultat ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select count(*)
    from Table2
    where Code_client1 ='00' and Code_client2 = '1'

  9. #9
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Le test à faire également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*)
    FROM Table2
    WHERE Code_client1||Code_client2 = '001'
    pour voir si l'on a pas qq chose du genre '0' & '01' et '00' & '1'

  10. #10
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut
    Quand je fais la requête de punkoff, je trouve 0.
    Quand je fais la requête de Garuda, je trouve 2.

    Déjà je ne comprends pas pourquoi une concaténation retourne un résultat et la séparation des deux champs retourne 0 ligne ?!

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Comme dit par Garuda, la représentation n'est peut-être pas 00 et 1, ça peut être 001 et null, 00 et 1, 0 et 01 ou null et 001.

    Pas de magie, il faut faire la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Code_client1, Code_client2
      FROM Table2
     WHERE Code_client1 || Code_client2 = '001'

  12. #12
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut
    Oups Oups ! je me suis trompée en faisant mes tests de punkoff et Garuda ! : j'obtiens 2 dans les deux cas. ça me rassure ! Désolée.

    Waldar, avec ta requête j'obtiens 2 lignes avec les mêmes codes.

    Mais j'ai comme l'impression qu'on s'éloigne de mon post initial :s.

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Sans connaître le contenu de votre table et de votre vue pour voir ce qui duplique les données difficile de répondre mieux que Garuda
    Ou qu'il manque une condition de jointure !!!!!
    ou que Glutinus
    Es-tu sûre que tu n'as pas rentré deux fois ton jeu de données dans l'une ou l'autre des tables ?
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Table1 WHERE Code_client = '001'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Table2 WHERE Code_client1 || Code_client2 = '001'

  14. #14
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut
    Ok. J'ajoute le contenu de ma table et ma vue, sachant que j'ai pris l'exemple d'un seul client.

    Je rappelle que quand je fais une simple requête uniquement sur ma vue, je trouve la quantité livrée = à 6.504. Mais quand j'utilise la jointure entre ma table et ma vue sur le code client, la quatité est multiplié par 2 => 13.008.
    Images attachées Images attachées   

  15. #15
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Ok dernière question, que voulez-vous obtenir comme résultat en rajoutant cette jointure ?

  16. #16
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut
    Je veux obtenir les 6.504

  17. #17
    Inactif  

    Homme Profil pro
    Freelance EURL / Business Intelligence ETL
    Inscrit en
    Avril 2005
    Messages
    5 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance EURL / Business Intelligence ETL
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2005
    Messages : 5 878
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Tu exécutes donc la requête que tu as mentionnée dans ton tout premier post.
    Tu as deux lignes "éligibles" pour ta condition de jointure dans la seconde table ( deux lignes avec pour valeur 001000000001). Si tu supprimes la fonction sum, tu verras que tes données apparaissent deux fois dans la requête. Pourquoi ? Parce que toutes les données ayant CLI_ID = '001000000001' vont être associées à la première ligne, puis à la seconde ligne. Il faut donc rendre tes jointures plus restrictives, ou rajouter des conditions.

    Plus d'info ici où SQLPro génère volontairement la même erreur que toi pour expliquer ce qui ne va pas.
    - So.... what exactly is preventing us from doing this?
    - Geometry.
    - Just ignore it !!
    ****
    "The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
    ***
    Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019

  18. #18
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Ok, l'idée dans ce genre de problème c'est de séparer l'agrégat et la jointure en deux étapes distinctes.

    En terme de SQL, ça se traduit ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * -- je ne sais pas quelles colonnes vous intéresse
      FROM (  SELECT Code_client
                   , sum(Qté_livrée) as qte_livree_total
                FROM Table1
            GROUP BY Code_client) T1
            INNER JOIN Table2 T2
              ON T2.Code_client1 || T2.Code_client2 = T1.Code_client;
    En BO vous serez forcément plus limité. À mon avis ce que vous avez de mieux à faire c'est construire deux requêtes, une qui fait l'agrégat sur Table1 et une autre qui récupère les données dans Table2.

    Ensuite vous reliez ces deux requêtes dans votre rapport sur le Code_client.
    Si vous avez un objet qui fait déjà la concaténation des Code_client1 et Code_client2 sur la Table2 ce sera plus simple.

  19. #19
    Membre confirmé
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Avril 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Avril 2010
    Messages : 135
    Par défaut
    Merci pour ton retour.

    L'univers BO et les objets créés sont destinés à des utilisateurs qui n'ont pas forcément les capacités techniques pour faire des requêtes compliquées dans BO!.
    Je ne peux pas livrer mon univers avec cette incohérence :s

  20. #20
    Inactif  

    Homme Profil pro
    Freelance EURL / Business Intelligence ETL
    Inscrit en
    Avril 2005
    Messages
    5 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance EURL / Business Intelligence ETL
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2005
    Messages : 5 878
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par JuniorBI Voir le message
    Merci pour ton retour.

    L'univers BO et les objets créés sont destinés à des utilisateurs qui n'ont pas forcément les capacités techniques pour faire des requêtes compliquées dans BO!.
    Je ne peux pas livrer mon univers avec cette incohérence :s
    On est bien d'accord. Mais visiblement c'est toi la responsable de l'univers BO, c'est donc à toi de fournir quelque chose qui sera transparent pour eux ! Donc il faut que ton univers BO prenne en compte les recommandations sus-citées (par exemple la requête de Waldar qui me semble appropriée).
    - So.... what exactly is preventing us from doing this?
    - Geometry.
    - Just ignore it !!
    ****
    "The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
    ***
    Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019

Discussions similaires

  1. [XSLT] CDATA par défaut lors d'une transformation xsl
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/12/2008, 13h57
  2. Obtenir un COUNT() = 0 lors d'une jointure ?
    Par elvex dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/07/2007, 21h48
  3. Réponses: 6
    Dernier message: 23/01/2007, 10h17
  4. Eviter la coupure d'un tableau en deux lors d'une impression
    Par zidrouz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 15/06/2006, 11h26

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