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 :

SQL : JOIN + SUM


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 132
    Points : 70
    Points
    70
    Par défaut SQL : JOIN + SUM
    Bonjour,
    J'ai une requête relativement compliquée (en tout cas pour moi) entre 8 tables (un select)

    Je dois remonter un certain nombre de données + la somme de chaque tender (moyen de payement).

    Le problème est que naturellement, mon SUM se multiplie... 8 fois...
    J'ai parcouru des forums à la recherche de la solution et je retrouve des solutions de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select .....
    from ( ...group by on invoice) a, (...group by on payment) b
    where a.custid=b.custid
    Mais la j'ai 8 tables et 263 champs, si je dois mettres tous les champs dans le select + tous les champs dans le from ca va faire un peu lourd et je ne vois pas comment faire d'ailleurs.

    J'ai essayé les LEFT OUTER JOIN mais ca ne marche pas.

    Ma requête se présente comme 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
    SELECT 
    i.invc_sid AS invc_sid,	
    ...
    SUM(CASE WHEN ( t.tender_type =  10)  THEN t.amt  END) AS GiftCard,	
    SUM(CASE WHEN ( t.tender_type =  11)  THEN t.amt  END) AS DebitCard,	
    SUM(CASE WHEN ( t.tender_type =  12)  THEN t.amt  END) AS FC,	
    SUM(CASE WHEN ( t.tender_type =  13)  THEN t.amt  END) AS Traveler,	
    SUM(CASE WHEN ( t.tender_type =  14)  THEN t.amt  END) AS CheqFC
    FROM 
    INVOICE i,	
    INVC_COMMENT ic,	
    INVC_TENDER t,	
    ...
    WHERE
    i.invc_sid		=	ic.invc_sid (+)
    AND	i.invc_sid	=	t.invc_sid (+)
    AND	i.invc_sid	=	c.invc_sid (+)	
    ...
    GROUP BY 
    i.invc_sid
    Je cherche donc comment faire cette jointure pour que ca marche...
    Merci de votre aide.

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Je ne vois pas où est ton problème de colonnes.
    Tu fais tes sommes en faisant juste la jointure entre invoice et tender.
    Le résultat, tu le joins avec toutes les tables annexes...

    (ou alors j'ai mal compris ton truc)

    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 xxxxx
    FROM
    	(SELECT i.invc_sid, 
    	SUM(CASE WHEN ( t.tender_type =  10)  THEN t.amt  END) AS GiftCard,	
    	SUM(CASE WHEN ( t.tender_type =  11)  THEN t.amt  END) AS DebitCard,	
    	SUM(CASE WHEN ( t.tender_type =  12)  THEN t.amt  END) AS FC,	
    	SUM(CASE WHEN ( t.tender_type =  13)  THEN t.amt  END) AS Traveler,	
    	SUM(CASE WHEN ( t.tender_type =  14)  THEN t.amt  END) AS CheqFC
    	FROM INVOICE i
    	  LEFT OUTER JOIN INVC_TENDER t	i.invc_sid	=	t.invc_sid
    	GROUP BY i.invc_sid
    	) agg
    JOIN table1 ON ...
    JOIN table2 ON ...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 132
    Points : 70
    Points
    70
    Par défaut
    SI je fais comme tu me dis, j'ai une erreur me disant que INVOICE n'est pas présent dans le FROM
    J'ai donc simplifié et j'ai toujours le même message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT i.sbs_no
    FROM 
           (SELECT i.invc_sid, 
    	SUM(CASE WHEN ( t.tender_type =  10)  THEN t.amt  END) AS GiftCard,	
    	SUM(CASE WHEN ( t.tender_type =  11)  THEN t.amt  END) AS DebitCard,	
    	SUM(CASE WHEN ( t.tender_type =  12)  THEN t.amt  END) AS FC,	
    	SUM(CASE WHEN ( t.tender_type =  13)  THEN t.amt  END) AS Traveler,	
    	SUM(CASE WHEN ( t.tender_type =  14)  THEN t.amt  END) AS CheqFC
    	FROM INVOICE i LEFT OUTER JOIN INVC_TENDER t ON INVOICE.invc_sid	=	INVC_TENDER.invc_sid
    	GROUP BY i.invc_sid
    	) 
    GROUP BY 
    i.sbs_no
    J'ai rien compris ?

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Tu ne peux pas utiliser le "i" en dehors de la requête entre parenthèses.
    Si tu as besoin de données supplémentaire de l'invoice, tu as deux moyens : refaire la jointure entre le group by entre parenthèses et invooice, ou ajouter un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT sbs_no
    FROM 
           (SELECT i.invc_sid, max(i.sbs_no) AS sbs_no, 
    	SUM(CASE WHEN ( t.tender_type =  10)  THEN t.amt  END) AS GiftCard,	
    	SUM(CASE WHEN ( t.tender_type =  11)  THEN t.amt  END) AS DebitCard,	
    	SUM(CASE WHEN ( t.tender_type =  12)  THEN t.amt  END) AS FC,	
    	SUM(CASE WHEN ( t.tender_type =  13)  THEN t.amt  END) AS Traveler,	
    	SUM(CASE WHEN ( t.tender_type =  14)  THEN t.amt  END) AS CheqFC
    	FROM INVOICE i LEFT OUTER JOIN INVC_TENDER t ON INVOICE.invc_sid	=	INVC_TENDER.invc_sid
    	GROUP BY i.invc_sid
    	)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

Discussions similaires

  1. requete sql jointure + sum() + group by?
    Par bylka dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2008, 12h06
  2. [SQL server] requete sql join/union?
    Par Alex35 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/11/2007, 16h45
  3. [SQL] Fonction SUM qui ne fonctionne pas !
    Par nigg4z dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 11/10/2007, 16h20
  4. SQL JOIN GROUP BY : le melange ne colle pas
    Par french-petzouille dans le forum Requêtes
    Réponses: 10
    Dernier message: 11/10/2007, 14h02
  5. Requête SQL + JOIN
    Par stef51 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 12/06/2007, 15h49

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