Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Membre du Club
    Inscrit en
    avril 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : avril 2005
    Messages : 110
    Points : 43
    Points
    43

    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:

    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:

    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:

    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...

  2. #2
    Membre du Club
    Inscrit en
    avril 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : avril 2005
    Messages : 110
    Points : 43
    Points
    43

    Par défaut

    Problème résolu en simplifiant la requête comme suit:

    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:

    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

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •