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 :

Jointures


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut Jointures
    Bonjour à tous,
    J'ai une requete qui me pose beaucoup de soucis, je vous la montre :
    Code SQL : 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
    29
    30
    31
    32
    33
    SELECT
      OAS_EL3.CODE CodeEL3,
      OAS_EL2.CODE CodeEL2,
      OAS_BAL1.PERIOD,
     - sum(OAS_BAL1.DEBIT_VALUE) - sum(OAS_BAL1.CREDIT_VALUE) reel
    FROM
      OAS_BALANCE OAS_BAL1,
      OAS_ELEMENT  OAS_EL1,
      OAS_ELEMENT  OAS_EL2,
      OAS_ELEMENT  OAS_EL3,
      OAS_GRPLIST  OAS_GRPLIST3,
      OAS_GROUP  OAS_GROUP3,
      OAS_GRPLIST  OAS_PILOTE
    WHERE
      ( OAS_BAL1.CMPCODE=OAS_EL1.CMPCODE and OAS_BAL1.EL1=OAS_EL1.CODE  )
      AND  ( OAS_BAL1.CMPCODE=OAS_EL2.CMPCODE and OAS_BAL1.EL2=OAS_EL2.CODE  )
      AND  ( OAS_BAL1.CMPCODE=OAS_EL3.CMPCODE and OAS_BAL1.EL3=OAS_EL3.CODE  )
      AND  ( OAS_EL3.CMPCODE=OAS_GRPLIST3.CMPCODE(+) and OAS_EL3.CODE=OAS_GRPLIST3.CODE(+)  )
      AND  ( OAS_GRPLIST3.CMPCODE=OAS_GROUP3.CMPCODE(+) and OAS_GRPLIST3.GRPCODE=OAS_GROUP3.CODE(+)  )
      AND  ( OAS_PILOTE.CMPCODE(+)=OAS_EL2.CMPCODE and OAS_PILOTE.CODE(+)=OAS_EL2.CODE  )
      AND OAS_BAL1.BALCODE = 'REEL'
    GROUP BY
      OAS_GRPLIST3.GRPCODE, 
      OAS_BAL1.BALCODE, 
      OAS_GROUP3.NAME, 
      OAS_EL3.CODE, 
      OAS_EL3.NAME, 
      OAS_EL2.CODE, 
      OAS_EL2.NAME, 
      OAS_EL1.CODE, 
      OAS_BAL1.PERIOD
    ORDER BY
      1

    Elle est compliquée, mais j'ai simplifié au maximum, elle l'est bcp plus en réalité.
    Le but ici est de récupérer la somme des crédits-débits de la table OAS_BAL1
    ici on met le filtre OAS_BAL1.BALCODE = 'REEL', ce qui correspond aux chiffres réels. Par contre il existe les mêmes lignes avec cette fois ci le budget OAS_BAL1.BALCODE = 'BUDGET'.
    J'aimerais donc grouper ces 2 lignes (reel et budget) en une.
    pour avoir réel et budget sur une ligne.
    Le souci est qu'en faisant ma requette, je n'arrive pas à récupérer les lignes qui sont présentes dans le budget mais pas le réel et inversement.

    Aurriez-vous une solution?
    Je n'y arrive pas du tout.
    Pour info il est possible pour moi de coder en 9i

  2. #2
    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
    Déjà réécrire votre requête en utilisant les INNER / OUTER JOINS simplifie énormément la lecture et la compréhension d'une requête (à fortiori quand il y a beaucoup de tables).

    Ensuite l'idée pour parvenir à votre résultat c'est de sélectionner tous les codes REEL et BUDGET, et "créer" des objets en sélection en utilisant des CASE.

    Je ne reprends pas toute votre requête, mais ça donnerait quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
         - SUM(CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.DEBIT_VALUE END) - SUM(CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.CREDIT_VALUE END) as REEL,
         - SUM(CASE OAS_BAL1.BALCODE WHEN 'BUDGET' THEN OAS_BAL1.DEBIT_VALUE END) - SUM(CASE OAS_BAL1.BALCODE WHEN 'BUDGET' THEN OAS_BAL1.CREDIT_VALUE END) as BUDGET
    FROM ...
    WHERE OAS_BAL1.BALCODE IN ('BUDGET', 'REEL')
    ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Génial, merci bien, par contre pas moyen de simplifier? je vais avoir des lignes du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    decode(( OAS_GROUP3.NAME ) , 'Chiffre d''affaires Net' , - sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.DEBIT_VALUE END)) - sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.CREDIT_VALUE END)) , 'Marge Nette' , - sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.DEBIT_VALUE END)) - sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.CREDIT_VALUE END)) , 'Chiffre d''affaires Comptable' , - sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.DEBIT_VALUE END)) - sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.CREDIT_VALUE END)) , sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.DEBIT_VALUE END)) + sum((CASE OAS_BAL1.BALCODE WHEN 'BDG2009'   THEN OAS_BAL1.CREDIT_VALUE END))) Budget,
     
      decode(( OAS_GROUP3.NAME ) , 'Chiffre d''affaires Net' , - sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.DEBIT_VALUE END)) - sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.CREDIT_VALUE END)) , 'Marge Nette' , - sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.DEBIT_VALUE END)) - sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.CREDIT_VALUE END)) , 'Chiffre d''affaires Comptable' , - sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.DEBIT_VALUE END)) - sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.CREDIT_VALUE END)) , sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.DEBIT_VALUE END)) + sum((CASE OAS_BAL1.BALCODE WHEN 'REEL'   THEN OAS_BAL1.CREDIT_VALUE END))) Reel

    Pire encore, je vais faire d'autres colonnes qui réutilisent ces champs, et je sais qu'on ne peut pas les rappeler en mettant juste reel ou budget...

    Peut être en mettant cette requête en sous requete, mais c'est plus couteux non?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Autre question, comment récupérer dans une nouvelle colonne la valeur réel dont le libellé est égal à 'x' par exemple?
    J'aurais donc la même valeur sur plusieurs lignes

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Citation Envoyé par Fuggerbit Voir le message
    Autre question, comment récupérer dans une nouvelle colonne la valeur réel dont le libellé est égal à 'x' par exemple?
    J'aurais donc la même valeur sur plusieurs lignes
    Je pose cette question dans un autre sujet.

  6. #6
    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
    Citation Envoyé par Fuggerbit Voir le message
    Pire encore, je vais faire d'autres colonnes qui réutilisent ces champs, et je sais qu'on ne peut pas les rappeler en mettant juste reel ou budget...

    Peut être en mettant cette requête en sous requete, mais c'est plus couteux non?
    C'est ce que je ferai, tous les éléments unitaires (avant les calculs) je les mettrai dans une première requête avec un nom plus court et compréhensible avant d'y refaire référence.
    Niveau performance ça ne devrait rien changer, et niveau lisibilité c'est beaucoup mieux !

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

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. pb jointure texture
    Par dweis dans le forum DirectX
    Réponses: 2
    Dernier message: 24/06/2003, 13h33
  3. Jointures en SQL
    Par Guizz dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/06/2003, 12h21
  4. Réponses: 14
    Dernier message: 17/03/2003, 18h31
  5. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29

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