2017-02-05 3 views
-1

J'essaie de résoudre un problème, mais je semble ne rien obtenir. Je veux afficher les élèves de 12e année qui ont obtenu une note inférieure à la moyenne pour les mathématiques, au lieu d'afficher leur moyenne plutôt que leurs moyennes mathématiques.SQL, requêtes imbriquées (MS ACCESS)

J'utilise msaccess et soupçonne l'utilisation de requêtes imbriquées sont des champs nécessaire.La avec lesquels je travaille sont prenom, last_name, qualité (de 1 à 12) et en mathématiques (contenant des marques mathématiques)

Je possède ce :

Select first_name,last_name,maths 
FROM students 
WHERE grade = 12 
HAVING ROUND(AVG(maths),1)< maths; 

sortie:

erreur: Vous avez essayé d'exécuter une requête qui ne comprend pas l'expression spécifiée « prenom » dans le cadre d'une fonction d'agrégation

Cependant, je ne sais pas pourquoi il lance cette erreur et il répète comme ça même après avoir enlevé le champ de sélection que je ne veux pas faire en premier lieu parce que je dois l'afficher

+0

Veuillez lire et agir sur [mcve]. Donner tout le code, l'entrée, la sortie, la sortie désirée et les messages d'erreur pertinents. – philipxy

+0

J'ai fourni le contexte, les champs, le résultat attendu et le code causant le problème que puis-je ajouter de plus? @philipxy –

+0

Lisez à propos de HAVING. Il est utilisé avec GROUP BY. Quand il n'y a pas de GROUP BY explicite, c'est comme si vous en aviez écrit un certain par défaut. Puisque le regroupement partitionne une table en groupes de lignes par valeur de sous-liste pour des colonnes spécifiées, on ne peut sélectionner que SELECT parmi ces colonnes, car il y a beaucoup de lignes avec des valeurs différentes pour les autres colonnes. PS Si vous avez donné le numéro d'erreur et le message, vous pourriez probablement obtenir votre réponse en recherchant directement sur Google. – philipxy

Répondre

0

Pour obtenir les utilisateurs qui obtiennent un score inférieur à la moyenne, vous pouvez faire une requête similaire à la vôtre, mais avec un group by:

select s.student_id, avg(maths) as avg_maths 
from students as s 
where s.grade = 12 
group by s.student_id 
having avg(maths) < (select avg(maths) from students where grade = 12); 

(note: Cela suppose que vous avez une carte d'identité pour chaque élève, plutôt que d'utiliser le nom.

Ensuite, vous pouvez obtenir les scores mathématiques originaux de différentes manières. Un moyen simple utilise in:

select first_name, last_name, maths 
from students 
where grade = 12 and 
     student_id in (select s.student_id, avg(s.maths) as avg_maths 
        from students as s 
        where s.grade = 12 
        group by s.student_id 
        having avg(maths) < (select avg(maths) from students where grade = 12) 
        );