es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tabla derivada no reconocida en el comando WHERE.

Soy nuevo y todavía estoy aprendiendo, así que por favor disculpa mis códigos. He buscado en Google y, como último recurso, estoy publicando en busca de ayuda. Espero que uno de los programadores más experimentados pueda ayudar.

Lo que estoy tratando de lograr: ¿qué curso tiene un número de estudiantes por debajo del promedio?

Estoy utilizando SQL Server Management Studio v18.

Mi código no funciona y no entiendo por qué no se está aceptando la tabla derivada. Soy consciente de que puedo crear otra subconsulta y lograrlo, pero aún así quiero entender por qué en este caso la tabla derivada C no está funcionando.

Por favor, ayúdenme con una explicación y sugieran la forma más sencilla de lograr esta consulta.

select 
    c.course, c.num_of_students
from
    (select 
         course, count(pname) as num_of_students
     from 
         Studies
     group by 
         COURSE) c
where 
    c.num_of_students < (select avg(c.num_of_students) from c);

Obtengo este error:

Nombre de objeto no válido ‘c’

Este nombre de objeto no válido se muestra resaltado en la línea de la cláusula WHERE.

Los datos se muestran correctamente en la vista previa.

Datos:

PNAME INSTITUTO CURSO CUOTA
ANAND SABHARI PGDCA 4500
ALTAF COIT DCA 7200
JULIANA BDPS MCA 22000
KAMALA PRAGATHI DCA 5000
MARY SABHARI PGDCA 4500
NELSON PRAGATHI DAP 6200
PATRICK PRAGATHI DCAP 5200
QADIR APPLE HDCA 14000
RAMESH SABHARI PGDCA 4500
REBECCA BRILLIANT DCAP 11000
REMITHA BDPS DCS 6000
REVATHI SABHARI DAP 5000
VIJAYA BDPS DCA 48000
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema principal con la consulta es que una tabla derivada no puede ser referenciada en la cláusula WHERE de la misma consulta. En este caso, estás intentando referenciar la tabla derivada C en la cláusula WHERE, lo cual no está permitido.

    Para lograr el objetivo de encontrar el curso con un número de estudiantes por debajo del promedio, puedes modificar la consulta de la siguiente manera:

    SELECT curso, COUNT(pname) AS num_of_students
    FROM Studies
    GROUP BY curso
    HAVING COUNT(pname) < (SELECT AVG(num_of_students) FROM 
                           (SELECT COUNT(pname) AS num_of_students FROM Studies GROUP BY curso) AS course_count)
    

    En esta consulta, utilizamos una subconsulta con una tabla derivada para calcular el número promedio de estudiantes por curso, y luego usamos la cláusula HAVING para filtrar el conjunto de resultados y mostrar únicamente los cursos con menos estudiantes que el promedio. La tabla derivada se utiliza como una subconsulta separada, la cual puede ser referenciada en la consulta principal.

    Alternativamente, puedes utilizar la función de ventana AVG() para calcular el número promedio de estudiantes por curso, y luego usar una subconsulta para filtrar el conjunto de resultados:

    SELECT curso, num_of_students
    FROM (
        SELECT curso, COUNT(pname) AS num_of_students, AVG(COUNT(pname)) OVER () AS avg_students
        FROM Studies
        GROUP BY curso
    ) AS course_stats
    WHERE num_of_students < avg_students
    

    Aquí, utilizamos la función de ventana AVG() para calcular el número promedio de estudiantes por curso, y luego usamos una subconsulta para filtrar el conjunto de resultados y mostrar únicamente los cursos con menos estudiantes que el promedio. La subconsulta selecciona el curso, el número de estudiantes y el número promedio de estudiantes en todos los cursos, los cuales pueden ser utilizados para filtrar el conjunto de resultados usando la cláusula WHERE.

Comments are closed.