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 :

decode sur deux colonnes


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 44
    Par défaut decode sur deux colonnes
    Je veux faire une requête qui fait la somme des montants mais en faisant le test sur le sens d'opération.Par exemple ma table contient:
    montant , sens
    10 , D
    20 , D
    30 , C
    12 , C

    Je veux en sortie:
    montantD, montantC
    30 , 42


    Merci

  2. #2
    Membre éprouvé
    Inscrit en
    Février 2009
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 127
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select debit.*, credit.* from 
      (select sum(montant) montantD from table where sens = 'D') debit,
      (select sum(montant) montantC from table where sens = 'C') credit

  3. #3
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    quel version oracle tu as ...
    et combien tu as de lignes exactement ?

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    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
     
    With data as (
      2  select 10 mnt, 'D' type from dual union all
      3  select 20 mnt, 'D' type from dual union all
      4  select 30 mnt, 'C' type from dual union all
      5  select 12 mnt, 'C' type from dual
      6  )
      7  select Max(case when type = 'D' then Sum(mnt) else null end) mntD,
      8         Max(case when type = 'C' then Sum(mnt) else null end) mntC
      9  from data
     10  group by type
     11  /
     
          MNTD       MNTC
    ---------- ----------
            30         42

  5. #5
    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 : 48
    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
    On peut économiser un aggrégat avec cette requête-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH DATA AS (
    SELECT 10 mnt, 'D' type FROM dual union ALL
    SELECT 20 mnt, 'D' type FROM dual union ALL
    SELECT 30 mnt, 'C' type FROM dual union ALL
    SELECT 12 mnt, 'C' type FROM dual
    )
    SELECT
         sum(case when type = 'D' then mnt else 0 end) mntD,
         sum(case when type = 'C' then mnt else 0 end) mntC
    FROM DATA

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Waldar Voir le message
    On peut économiser un aggrégat avec cette requête-ci :
    ...
    C'est mieux

  7. #7
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 44
    Par défaut
    Les réponses sont bonnes mais ça ne résout pas mon problème.J'ai d'autres champs à sélectionner dans d'autres tables.Exemple:

    Select a.client,a.nom,b.mont,c.libelle,sum(d.mnt) mntD,sum(d.mnt) mntC
    from table1 a,table2 b,table3 c,table4 d
    where (conditions)

    group by a.client,a.nom,b.mont,c.libelle


    Ma version d'oracle est 9.2.0.5

  8. #8
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    combien de lignes dans les 4 tables ,


    Peux tu envoyer les desc des 4 tables ?

    a quoi ressemble le resultat que tu veux obtenir ? ...

    car entre ce que tu aposé comme question au debut et ce que tu a reposté ...

    ca eviterait de faire des with clause avec des union en dur comme en haut ....

  9. #9
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 44
    Par défaut
    Bonjour,
    Voici la requête telle que je voudrai:

    select a.age,a.cli,a.cha,rtrim(b.nom,' ')||' '||rtrim(b.pre,' ') Nom,a.sde,c.maut mon,max(c.ech) echeance,b.ges,b.sec,d.lib1 nom_ges,e.lib1 nom_sect,sum(decode(f.mon,sen=D,' ')) mntD,sum(decode(f.mon,sen=C,' ')) mntC
    from table1 a,table2 b,table3 c,table4 d,table5 e,table6 f
    where a.cli=b.cli
    and a.age=c.age(+)
    and a.ncp=c.ncp(+)
    and a.dev=c.dev(+)
    and a.age=f.age
    and a.ncp=f.ncp
    and a.dev=f.dev
    and substr(a.cha,1,3) in ('251','201','202','203','204','903','913','291')
    and b.catl='U'
    and (b.ges=d.cacc and d.ctab='035')
    and (b.sec=e.cacc and e.ctab='071')
    and a.dco='31/12/07'
    and f.dco between '01/01/07' and '31/12/07'
    group by a.age,a.cli,a.cha,b.nom,b.pre,a.sde,c.maut, b.ges,b.sec,d.lib1,e.lib1


    La table6 contient plus 13 millions de lignes

  10. #10
    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 : 48
    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
    Je ne vois que deux montants dans votre requête, les solutions proposées demeurent applicables.
    Au passage je normalise vos jointures histoire de rentre votre requête plus lisible :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    select
        a.age,
        a.cli,
        a.cha,
        rtrim(b.nom) || ' ' || rtrim(b.pre) Nom,
        a.sde,
        c.maut mon,
        max(c.ech) echeance,
        b.ges,
        b.sec,
        d.lib1 nom_ges,
        e.lib1 nom_sect,
        sum(decode(f.sen, 'D', f.mon, 0)) mntD, -- decode ou case
        sum(decode(f.sen, 'C', f.mon, 0)) mntC
    from
        table1 a
        inner join table2 b
          on b.cli = a.cli
        left outer join table3 c
          on c.age = a.age
         and c.ncp = a.ncp
         and c.dev = a.dev
        inner join table4 d
          on d.cacc = b.ges
        inner join table5 e
          on e.cacc = b.sec
        inner join table6 f
          on f.age = a.age
         and f.ncp = a.ncp
         and f.dev = a.dev
    where  
        substr(a.cha,1,3) in ('201','202','203','204','251','291','903','913') -- conseil : ordonnez votre liste de valeur
    and b.catl = 'U'
    and d.ctab = '035'
    and e.ctab = '071'
    and a.dco = to_date('31/12/2007', 'dd/mm/yyyy') -- on compare des dates avec des dates
    and f.dco between to_date('01/01/2007', 'dd/mm/yyyy')
                  and to_date('31/12/2007', 'dd/mm/yyyy')
    group by
        a.age,
        a.cli,
        a.cha,
        rtrim(b.nom) || ' ' || rtrim(b.pre), -- attention il faut bien faire le group by sur les mêmes champs que le select sous peine de risquer des différences de résultat !
        a.sde,
        c.maut,
        b.ges,
        b.sec,
        d.lib1,
        e.lib1
    -- f.sen -- j'ai un doute sur celui-ci, essayez !

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

Discussions similaires

  1. Flottant à cheval sur deux colonnes
    Par yobbas dans le forum Mise en forme
    Réponses: 2
    Dernier message: 29/09/2006, 16h02
  2. [XSLT] Mettre sur deux colonnes
    Par tiboel dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/07/2006, 14h38
  3. Afficher des enregistrements sur deux colonnes
    Par Dauphind dans le forum Access
    Réponses: 1
    Dernier message: 22/06/2006, 14h16
  4. [Tableaux] Array sur deux colonnes et foreach..
    Par shadeoner dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2006, 08h46
  5. [CR] Faire un groupe sur deux colonnes, voir mon exemple
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 08/10/2004, 14h02

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