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
Version imprimable
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
Salut,
Code:
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
Bonjour,
quel version oracle tu as ...
et combien tu as de lignes exactement ?
Code:
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
On peut économiser un aggrégat avec cette requête-ci :
Code:
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
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
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 ....
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
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:
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 !