J'ai 3 tables de base de données, que je souhaite utiliser dans ma requête SQL:

Le problème est que je veux faire GROUP BY sur une valeur "Nom de l'école" trouvée dans la table MYMAINSCHEMA.SURVEY. Cependant, le "Nom de l'école" peut parfois être en majuscules ou en minuscules.

Voici mon SQL:

select SR.SCHOOL_NUM,UPPER(S.SCHOOLNAME), COUNT(S.SWSID) AS NUMSTUDENTS 
from MYMAINSCHEMA.SURVEY S 
JOIN MYOTHERSCHEMA.SCHOOL_RTO SR ON S.SCHOOLCODE = SR.SCHOOL_NUM
JOIN  MYOTHERSCHEMA.RTO R ON R.RTO_NUM = SR.RTO_NUM 
GROUP BY SR.SCHOOL_NUM,UPPER(S.SCHOOLNAME)
ORDER BY S.SCHOOLNAME ASC;

L'exécution de ce qui précède me donne l'erreur "pas une expression GROUP BY". Si je supprime le UPPER dans la 1ère et la 2ème dernière ligne, cela fonctionne bien, mais le résultat renvoie des noms d'ECOLE en double (certains en majuscules, d'autres en minuscules).

Est-il possible de résoudre ce problème?

Merci d'avance.

2
Ghaml 17 janv. 2017 à 07:23

2 réponses

Meilleure réponse

Essaye ça:

select SR.SCHOOL_NUM,
  UPPER(S.SCHOOLNAME) SCHOOLNAME, -- added alias here
  COUNT(S.SWSID) AS NUMSTUDENTS 
from MYMAINSCHEMA.SURVEY S 
JOIN MYOTHERSCHEMA.SCHOOL_RTO SR ON S.SCHOOLCODE = SR.SCHOOL_NUM
JOIN  MYOTHERSCHEMA.RTO R ON R.RTO_NUM = SR.RTO_NUM 
GROUP BY SR.SCHOOL_NUM,UPPER(S.SCHOOLNAME)
ORDER BY SCHOOLNAME ASC;  -- fixed here by sorting on the alias
                          -- (can use "UPPER(S.SCHOOLNAME)")

Le UPPER(S.SCHOOLNAME) est utilisé dans l'agrégation. Ainsi, S.SCHOOLNAME n'est pas disponible pour la commande. Soit utilisez UPPER(S.SCHOOLNAME), c'est l'alias ou le numéro de colonne.

1
Gurwinder Singh 18 janv. 2017 à 04:07

Le problème est le ORDER BY. Utilisez simplement le UPPER() là aussi:

ORDER BY UPPER(S.SCHOOLNAME) ASC;

Si je suppose que school_num est en fait unique, je pourrais suggérer:

select SR.SCHOOL_NUM, MAX(UPPER(S.SCHOOLNAME)),
        COUNT(S.SWSID) AS NUMSTUDENTS 
from MYMAINSCHEMA.SURVEY S join
     MYOTHERSCHEMA.SCHOOL_RTO SR 
     on S.SCHOOLCODE = SR.SCHOOL_NUM join
     MYOTHERSCHEMA.RTO R 
     on R.RTO_NUM = SR.RTO_NUM 
group by SR.SCHOOL_NUM
order by MAX(UPPER(S.SCHOOLNAME)) ASC;
1
Gordon Linoff 17 janv. 2017 à 04:25