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 :

Erreur sur une jointure externe


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Points : 45
    Points
    45
    Par défaut Erreur sur une jointure externe
    bonjour, après plusieurs tentatives je viens a vous en espérant avoir une réponse. J'ai une requête sql qui doit me retourner la somme des ventes et quantité en stock des différents produits. pour cela j'ai choisir une jointure externe pour pourvoir avoir tous les produits et ensuite avoir les ventes et les stock restant de chacun de ces produits. le problème c'est que cette requête me retourne des valeurs supérieur a ce qui est réelement présent dans la base de données comme s'il additionnait plusieurs fois les mêmes valeurs et ce qui me parait incompréhensible du faite des restrictions faites dans la requête qui devrait éviter cela. voici la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select e.CODE_PRODUIT "Code Produit",e.DESIGNATION "Designation",
    		 to_char(NVL(round(sum(t.QTE_VEN)),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Vendue",
    		 to_char(NVL(round(sum(t.VALEUR_VENTE)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "C.A.H.T",
    		 to_char(NVL( round(sum(t.MARGE_HT)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "Marge HT",
    		to_char(NVL(round(sum(s.QUANTITE) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Stock",
    		to_char(NVL(round(sum(s.VALEUR_PRIX_REV) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Valeur du stock"
            FROM PRODUIT e
                   LEFT OUTER JOIN VENTE_JOUR t
    		on(e.CODE_PRODUIT=t.CODE_PRODUIT AND t.DATE_GENERATION between '". $_POST['date'] . "' and '" . $_POST['date1'] . "')	
                   LEFT OUTER JOIN STOCK s 
                                         on(e.CODE_PRODUIT=s.CODE_PRODUIT and s.DATE_GENERATION ='". $_POST['date1'] . "' )
            group by e.CODE_PRODUIT,e.DESIGNATION order by NVL(round(sum(t.VALEUR_VENTE)),0) desc
    le resultat retourné pour un produit X est excessivement élevée par rapport a la valeur réel contenu dans la table.
    Aussi en mettant une jointure entre 2 tables j'ai les bons résultats
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select e.CODE_PRODUIT "Code Produit",e.DESIGNATION "Designation",
    		 to_char(NVL(round(sum(t.QTE_VENDUE)),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Vendue",
    		 to_char(NVL(round(sum(t.VALEUR_VENTE)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "C.A.H.T",
    		 to_char(NVL( round(sum(t.MARGE_HT)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "Marge HT",
    		 to_char(round((sum(t.VALEUR_VENTE)-sum(t.VALEUR))*100/nullif(sum(t.VALEUR_VENTE),0),2),'999G999G999G999D99',  'nls_numeric_characters='', ''') "TAUX"
    		FROM PRODUIT e
    		LEFT OUTER JOIN VENTE_JOUR t
    		on(e.CODE_PRODUIT=t.CODE_PRODUIT) AND t.DATE_GENERATION between '". $_POST['date'] . "' and '" . $_POST['date1'] . "'
            group by e.CODE_PRODUIT,e.DESIGNATION order by NVL(round(sum(t.VALEUR_VENTE)),0) desc
    Comment resourdre cela car j'ai besoin de lier les trois table pour avoir ces différents infos sur une même page. je precise que mon SGBDR est ORACLE
    Merci de vos aident

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    C'est normal, vous multipliez le résultat primaire par le nombre de ligne de la table stock pour chaque lien.

    Il faut procéder en deux temps, par exemple à l'aide d'une CTE :

    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
    WITH T AS
    (
    SELECT e.CODE_PRODUIT "Code Produit",e.DESIGNATION "Designation",
    		 to_char(NVL(round(sum(t.QTE_VENDUE)),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Vendue",
    		 to_char(NVL(round(sum(t.VALEUR_VENTE)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "C.A.H.T",
    		 to_char(NVL( round(sum(t.MARGE_HT)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "Marge HT",
    		 to_char(round((sum(t.VALEUR_VENTE)-sum(t.VALEUR))*100/nullif(sum(t.VALEUR_VENTE),0),2),'999G999G999G999D99',  'nls_numeric_characters='', ''') "TAUX"
    FROM PRODUIT e
         LEFT OUTER JOIN VENTE_JOUR t
              ON(e.CODE_PRODUIT=t.CODE_PRODUIT) AND t.DATE_GENERATION BETWEEN '". $_POST['date'] . "' AND '" . $_POST['date1'] . "'
    GROUP BY e.CODE_PRODUIT,e.DESIGNATION ORDER BY NVL(round(sum(t.VALEUR_VENTE)),0) DESC
    )
    SELECT T.*,
           to_char(NVL(round(sum(s.QUANTITE) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Stock",
    	   to_char(NVL(round(sum(s.VALEUR_PRIX_REV) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Valeur du stock"
    FROM   T
           LEFT OUTER JOIN STOCK s 
                ON(e.CODE_PRODUIT=s.CODE_PRODUIT AND s.DATE_GENERATION ='". $_POST['date1'] . "' )
    GROUP  BY T."Code Produit", T."Designation", T."Qte Vendue", T."C.A.H.T", T."Marge HT", T."TAUX"
    ORDER BY NVL("C.A.H.T", 0) DESC
    A +

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    C'est normal, vous multipliez le résultat primaire par le nombre de ligne de la table stock pour chaque lien.

    Il faut procéder en deux temps, par exemple à l'aide d'une CTE :

    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
    WITH T AS
    (
    SELECT e.CODE_PRODUIT "Code Produit",e.DESIGNATION "Designation",
    		 to_char(NVL(round(sum(t.QTE_VENDUE)),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Vendue",
    		 to_char(NVL(round(sum(t.VALEUR_VENTE)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "C.A.H.T",
    		 to_char(NVL( round(sum(t.MARGE_HT)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "Marge HT",
    		 to_char(round((sum(t.VALEUR_VENTE)-sum(t.VALEUR))*100/nullif(sum(t.VALEUR_VENTE),0),2),'999G999G999G999D99',  'nls_numeric_characters='', ''') "TAUX"
    FROM PRODUIT e
         LEFT OUTER JOIN VENTE_JOUR t
              ON(e.CODE_PRODUIT=t.CODE_PRODUIT) AND t.DATE_GENERATION BETWEEN '". $_POST['date'] . "' AND '" . $_POST['date1'] . "'
    GROUP BY e.CODE_PRODUIT,e.DESIGNATION ORDER BY NVL(round(sum(t.VALEUR_VENTE)),0) DESC
    )
    SELECT T.*,
           to_char(NVL(round(sum(s.QUANTITE) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Stock",
    	   to_char(NVL(round(sum(s.VALEUR_PRIX_REV) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Valeur du stock"
    FROM   T
           LEFT OUTER JOIN STOCK s 
                ON(e.CODE_PRODUIT=s.CODE_PRODUIT AND s.DATE_GENERATION ='". $_POST['date1'] . "' )
    GROUP  BY T."Code Produit", T."Designation", T."Qte Vendue", T."C.A.H.T", T."Marge HT", T."TAUX"
    ORDER BY NVL("C.A.H.T", 0) DESC
    A +
    Merci de me repondre. cependant je suis pas un expert en sql donc je me perd dans votre requete si pouvez me l'expliquer j'en serais ravi car j'ai essayer d'executer cette requete j'ai un message concernant l'alias e a ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON(e.CODE_PRODUIT=s.CODE_PRODUIT AND s.DATE_GENERATION ='". $_POST['date1'] . "' )
    c'est à dire après le with dont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T.*,
           to_char(NVL(round(sum(s.QUANTITE) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Stock",
    	   to_char(NVL(round(sum(s.VALEUR_PRIX_REV) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Valeur du stock"
    FROM   T
           LEFT OUTER JOIN STOCK s 
                ON(e.CODE_PRODUIT=s.CODE_PRODUIT AND s.DATE_GENERATION ='". $_POST['date1'] . "' )
    GROUP  BY T."Code Produit", T."Designation", T."Qte Vendue", T."C.A.H.T", T."Marge HT", T."TAUX"
    ORDER BY NVL("C.A.H.T", 0) DESC
    . merci

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Points : 45
    Points
    45
    Par défaut
    voyant la syntaxe j'ai adaptée la requete mais là, la BDD se plante pas de reponse. voici la requete
    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
    WITH T AS
    (
    SELECT e.CODE_PRODUIT "Code Produit",e.DESIGNATION "Designation",
    		 to_char(NVL(round(sum(t.QTE_VENDUE)),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Vendue",
    		 to_char(NVL(round(sum(t.VALEUR_VENTE)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "C.A.H.T",
    		 to_char(NVL( round(sum(t.MARGE_HT)),0) ,'999G999G999G999',  'nls_numeric_characters='', ''') "Marge HT",
    		 to_char(round((sum(t.VALEUR_VENTE)-sum(t.VALEUR))*100/nullif(sum(t.VALEUR_VENTE),0),2),'999G999G999G999D99',  'nls_numeric_characters='', ''') "TAUX"
    FROM PRODUIT e
         LEFT OUTER JOIN VENTE_JOUR t
              ON(e.CODE_PRODUIT=t.CODE_PRODUIT) AND t.DATE_GENERATION BETWEEN '01/06/2013' AND '09/06/2013'
    GROUP BY e.CODE_PRODUIT,e.DESIGNATION ORDER BY NVL(round(sum(t.VALEUR_VENTE)),0) DESC
    )
    SELECT T.*,
           to_char(NVL(round(sum(s.QUANTITE) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Qte Stock",
    	   to_char(NVL(round(sum(s.VALEUR_PRIX_REV) ),0),'999G999G999G999',  'nls_numeric_characters='', ''') "Valeur du stock"
    FROM T 
           LEFT OUTER JOIN STOCK s 
                ON(T."Code Produit"=s.CODE_PRODUIT AND s.DATE_GENERATION ='09/06/2013' )
    GROUP BY T."Code Produit", T."Designation", T."Qte Vendue", T."C.A.H.T", T."Marge HT", T."TAUX"
    ORDER BY NVL("C.A.H.T", 0) DESC

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 98
    Points : 45
    Points
    45
    Par défaut
    Salut la requête s’exécute mais prend excessivement de temps pratiquement 4mn

Discussions similaires

  1. Incertitude sur une jointure externe
    Par J0r_x dans le forum Développement
    Réponses: 0
    Dernier message: 18/06/2010, 10h07
  2. Une question aux Grands du Sql, sur les jointures externes
    Par tonton67 dans le forum Développement
    Réponses: 3
    Dernier message: 26/01/2009, 09h08
  3. Erreur SQL sur une jointure
    Par sebhm dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/11/2008, 00h18
  4. [SQL Server] Filtré sur une table avant une jointure externe
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2006, 15h52
  5. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42

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