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 :

Case , Sum et Group by [11gR2]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut Case , Sum et Group by
    bonjour,

    je réalise une requête qui doit cumuler des réponses à des questions suivant une clé de formulaire définie,
    mes réponses sont soit des numériques et je souhaite faire une moyenne des valeurs numérique soit du texte et je souhaite tout agréger en une grosse chaîne de texte.

    j'ai dans ma requête fait ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ....       
           case when pivt.rn =1 then 
             case when pivt.is_numeric_scale=1
                then to_char(sum(pivt.response)
                )
             else RTrim(xmlagg(xmlelement(a,pivt.response || ',').extract('//text()')),',')
             end 
           end   AS reponse1
    ....
    pour le moment je ne cherche par à faire la moyenne (j'ai pas encore trouvé à cumuler le nombre de réponse) mais déjà à sommer des valeurs de réponses.
    j'ai un soucis avec le case et le group by

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ORA-00979: n'est pas une expression GROUP BY
    00979. 00000 -  "not a GROUP BY expression"
    *Cause:    
    *Action:
    Erreur à la ligne 62, colonne 10
    quelqu'un a t'il une idée pour m'aider à solutionner mon problème ?

  2. #2
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    j'ai progressé je dois mettre dans le group by
    pivt.rn, pivt.is_numeric_scale

    seulement je ne souhaite pas tenir compte de ces deux critères dans mon group by.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Vous n'avez pas posté la partie GROUP BY de votre requête, il va donc être difficile de vous aider...

    La requête entière serait encore mieux.

    seulement je ne souhaite pas tenir compte de ces deux critères dans mon group by
    Pourquoi ?
    Vous ne souhaitez pas à la fois une somme (de nombres) et la concaténation (de caractères) sur la même ligne ?!?

  4. #4
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    bonsoir,

    voici déjà ce qui fonctionne : j'ai ma requete qui traite pour le moment en somme mes réponses numériques.

    le résultat donne :
    104326 Jacques xxxxx eeeeeeeeeee 1314 gggggggggggggggg 4 3 5 4
    103497 Christine xxxxx eeeeeeeeeee 1314 gggggggggggggggg 4 5 4 5
    102744 Jean-Paul xxxxx eeeeeeeeeee 1314 gggggggggggggggg 4 3 5 5
    000001 xxxxxt xxxxxx eeeeeeeeeee 1314 gggggggggggggggg 3 4 5 3
    103497 Christine xxxxx eeeeeeeeeee 1314 gggggggggggggggg 3 3 3 3
    les 4 dernires colonnes étant les moyennes des sommes cumulées.

    mon code :

    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
     
    Select pivt.resource_id, 
              ahs.first_name,
              ahs.surname, 
              ser.service_id,
              ser.serviceoff_id,
              ser.offering_desc, 
              sum(case pivt.rn when 1 then pivt.response end) / (Select count(*) From  eval_dtresponse dtr Where dtr.rn =1 and dtr.serviceoff_fk=pivt.serviceoff_fk) AS reponse1,
              sum(case pivt.rn when 2 then pivt.response end) / (Select count(*) From  eval_dtresponse dtr Where dtr.rn =2 and dtr.serviceoff_fk=pivt.serviceoff_fk) AS reponse2,
              sum(case pivt.rn when 3 then pivt.response end) / (Select count(*) From  eval_dtresponse dtr Where dtr.rn =3 and dtr.serviceoff_fk=pivt.serviceoff_fk) AS reponse3,
              sum(case pivt.rn when 4 then pivt.response end) / (Select count(*) From  eval_dtresponse dtr Where dtr.rn =4 and dtr.serviceoff_fk=pivt.serviceoff_fk) AS reponse4,
              sum(case pivt.rn when 5 then pivt.response end) / (Select count(*) From  eval_dtresponse dtr Where dtr.rn =5 and dtr.serviceoff_fk=pivt.serviceoff_fk) AS reponse5,
              sum(case pivt.rn when 6 then pivt.response end) / (Select count(*) From  eval_dtresponse dtr Where dtr.rn =6 and dtr.serviceoff_fk=pivt.serviceoff_fk) AS reponse6   
       From  eval_dtresponse  pivt
       INNER JOIN aemserviceoff ser on (ser.serviceoff_pk = pivt.serviceoff_fk and ser.client='P1')
       INNER JOIN ahsresources ahs on ( ahs.resource_id = pivt.resource_id)
       where  1=1 and pivt.type_id='ECHELLE'
       Group by 
             pivt.resource_id,
             ahs.first_name,
             ahs.surname,
             pivt.serviceoff_fk,
             ser.service_id,
             ser.serviceoff_id,
             ser.offering_desc
             --pivt.rn,
             --pivt.is_numeric_scale
      Order by ser.service_id, ser.serviceoff_id,pivt.resource_id
    Remarque :
    j'ai en amont une table temporaire qui mixe ligne à ligne des réponses de type numérique et d'autre de type texte. j'ai réalisé une sorte de pivot qui me permet de mettre mes lignes en colonnes pour ma cle représentant mon questionnaire.

    je souhaite traiter au même niveau des réponses de type texte et les cumuler sur la même clé par
    RTrim(xmlagg(xmlelement(a,pivt.response || ',').extract('//text()')),',')

    ce qui reviendrait à transformer mes sommes comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    .....
             case 
              when pivt.is_numeric_scale=1 then sum(pivt.response)
             --else RTrim(xmlagg(xmlelement(a,pivt.response || ',').extract('//text()')),',')
             end as x
    ....
    mais cela ne fonctionne pas et j'ai pas d'idées

    merci à vous

  5. #5
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Par défaut
    je cloture ce post.

    si cela peut aider quelqu'un un jour.

    je procède autrement , je traite mes réponses par deux colonnes relatif aux types de réponses possibles numérique / varchar2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              sum(case pivt.rn when 1 then pivt.numeric_response end)   / (Select count(*) From  eval_dtresponse dtr Where dtr.rn =1 and dtr.serviceoff_fk=pivt.serviceoff_fk) AS num_reponse1,
              LISTAGG(case when pivt.rn = 1 then  varchar_response end, '; ') WITHIN GROUP (ORDER BY pivt.resource_id,pivt.serviceoff_fk,pivt.rn) As var_reponse1,
    en remarque : le sum encapsule le case évidant de le mettre pivt.rn dans le group by .

    le tout dans une table temporaire puis je traite mes données pour les mettre en forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    case when nvl(synt.num_reponse1,-1) <>-1 then to_char(synt.num_reponse1) else synt.var_reponse1 end as response1,
    cela fait une table temporaire en plus mais j'arrive à un résultat.

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

Discussions similaires

  1. [SQL] Jointure de table avec SUM et GROUP BY
    Par waterjetmedia dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/09/2007, 13h17
  2. Réponses: 3
    Dernier message: 03/04/2007, 11h29
  3. Requête SQL avec UNION, sum et GROUP BY
    Par Guitariff dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/12/2006, 13h48
  4. ajout case option dans groupe option
    Par Pierren dans le forum Access
    Réponses: 2
    Dernier message: 06/10/2006, 19h25
  5. Problème avec les cases d'un groupe d'option.
    Par auriolbeach dans le forum Access
    Réponses: 2
    Dernier message: 01/10/2005, 07h33

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