Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PHP & Oracle
PHP & Oracle Forum d'entraide sur Oracle avec PHP. Avant de poster -> FAQ Oracle et Cours Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/01/2012, 13h22   #1
Thomf
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 80
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 80
Points : 29
Points : 29
Par défaut SQL: group by qui ne fonctionne pas

Bonjour,

Sous oracle10 et Toad, je rencontre un problème que je n'avais jamais vu concernant une requête contenant la fonction "group by".
A savoir que le champ est bien identifié dans le select et le group by mais je reçois un message d'erreur "not a single-group ora-000937" sur le champ en question dans la requête suivante:

Citation:
select distinct c1.code,
,to_char(last_day(to_date(min(max(iqaamm)),'yyyymm')),'dd/mm/yyyy')
from client c1, dossier d, L7546_HI_00.hiql i
where c1.role = '1'
and c1.code = d.clie
and i.doss=d.code
and i.qaamm in (select max(qaamm) from L7546_HI_00.hiql where doss= d.code)
and i.rubr in (select code from t_rubr where regr='charges')
group by c1.code
Par contre, si je mets un max devant le 1er champ, ça fonctionne:

Citation:
select distinct max(c1.code),
,to_char(last_day(to_date(min(max(iqaamm)),'yyyymm')),'dd/mm/yyyy')
from client c1, dossier d, L7546_HI_00.hiql i
where c1.role = '1'
and c1.code = d.clie
and i.doss=d.code
and i.qaamm in (select max(qaamm) from L7546_HI_00.hiql where doss= d.code)
and i.rubr in (select code from t_rubr where regr='charges')
group by c1.code
Or ce n'est pas tellement mon but car ma requête est plus élaborée que cela et certaines valeurs risquent d'être faussées avec la fonction max.
Aussi ma question est de savoir si il y a une particularité avec oracle 10 concernant la fonction group by.

Merci d'avance

Thomas

PS: j'ai corrigé entre-temps mon post en précisant que l'origine venait non pas du group by mais du fait que je veux récupérer la date du début maximum que j'ai traduit ici à ma façon pour une meilleure compréhension (si je suis clair ) mais en fait il faut la récupérer d'une autre table avec un solde par terme et tantôt il est en impayé, tantôt non comme suit:

Citation:
TERME SOLDE
200905 0
200906 160
200907 200
200808 0
200909 100
200910 120
En utilisant min(max(s.terme)), j'arrive bien à récupérer dans un "select simple" le terme maxi d'impayé que je transforme en format date, dans ce cas il s'agit de 200909 mais dès qu'il est associé à un champ ceci perturbe mon group by apparemment...
Thomf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 15h27   #2
Thomf
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 80
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 80
Points : 29
Points : 29
Problème résolu en simplifiant la requête comme suit:

Citation:
select distinct c1.code,
,to_char(last_day(to_date(iqaamm,'yyyymm')),'dd/mm/yyyy')
from client c1, dossier d, L7546_HI_00.hiql i
where c1.role = '1'
and c1.code = d.clie
and i.doss=d.code
and i.qaamm in (select max(qaamm) from L7546_HI_00.hiql where doss= d.code)
and i.rubr in (select code from t_rubr where regr='charges')
group by c1.code
Bien que précisant que la configuration de la requête est plutôt la suivante en réel:

Citation:
select distinct c2.nom_p,
c1.adr1,c1.lcom||' ('||c1.ptt||')',
ltrim(to_char(x.solde,'999G999G999D99','nls_numeric_characters = '', ''')),
to_char(last_day(to_date(s.terme,'yyyymm')),'dd/mm/yyyy')
,sum(nvl(i.mtech,0))
from client c1, v_civilite c2, evenement e, dossier d, ensemble en, contentieux co, solde x, L7546_HI_00.hiql i, solter s
where c1.role = '1'
and c1.code = c2.code_client(+)
and e.code = c1.code
and e.rang = constante_rang
and d.code='constante_code'
and c1.code = d.clie
and substr(d.Code,1,4) = en.code
and co.code(+) = d.ctx
and x.doss = e.doss
and x.cmpt = '41110000'
and s.doss=e.doss
and s.ster>0
and s.terme in (select min(max(terme)) from solter where doss=e.doss and ster>0 group by terme)
and i.doss=e.doss
and i.qaamm in (select max(qaamm) from L7546_HI_00.hiql where doss= e.doss)
and i.rubr in (select code from t_rubr where regr='charges')
group by c2.nom_p,
c1.adr1, c1.lcom||' ('||c1.ptt||')', ltrim(to_char(x.solde,'999G999G999D99','nls_numeric_characters = '', ''')),to_char(last_day(to_date(s.terme,'yyyymm')),'dd/mm/yyyy'
Ce qui est en gras était auparavant dans le select et gênait mon group by.
Je l'ai retiré et depuis ça fonctionne. C'était aussi simple que cela

Thomas
Thomf est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h06.


 
 
 
 
Partenaires

Hébergement Web