none
Necesito ayuda con esta consulta RRS feed

  • Pregunta

  • Hola compañeros tanto tiempo, recuerdo que ustedes me ayudaban mucho en todas mis dudas, así que decidí visitarlos nuevamente.

    Pues el tema es que no recuerdo mucho de consultas SQL y tengo problemas con este ejercicio:

    "Mostrar cédula y nombre del/los estudiante/s que registra/n la mayor cantidad de evaluaciones"

    Evaluaciones(codMateria, fecha)

    Materias (codMateria, nomMateria, duracion)

    Asignados(codMateria, fecha, idPersona, cantHoras)

    EvalEst(CodMateria, fecha, idPersona, nota)

    Personas (idPersona, cedula, nombre, rol) rol puede ser "estudiante" o "docente"

    Hice algo así....

    SELECT P.cedula, P.nombre
    FROM Personas P
    WHERE P.idPersona IN

    (SELECT TOP 3 idPersona, count(idPersona) AS [Cantidad de Evaluaciones]
    FROM EvalEst
    GROUP BY idPersona)

    Me da error, no se como hacerlo :(

    viernes, 31 de julio de 2015 17:42

Respuestas

  • Hola AnalistaStr,

    Lo primero que tienes que hacer es recrear el modelo de tablas "in-memory". Entonces, verás que las evaluaciones corresponden a ciertas materias y las materias son cursadas por ciertas personas. Lo que necesitamos primero es poder relacionar las tablas y para ello haremos uso de INNER JOIN. Lo haremos paso a paso tal y como lo haría el procesador de consultas.

    Personas AS pers
    INNER JOIN Asignados AS asig ON (asig.idPersona = pers.idPersona)
    INNER JOIN Evaluaciones AS eval ON (eval.codMateria = mate.CodMateria)


    Con esto ya tenemos  relacionadas todas las tablas que requerimos para dar solución al problema. Tenemos todas  las Personas [Personas] que están asignadas a un curso [Asignados] y de las materias relacionadas con la persona tenemos sus evaluaciones [Evaluaciones]. Pero, la combinación generará varias filas según materias y evaluaciones tenga la persona, pero como el objetivo es sólo mostrar la cantidad de evaluaciones por persona entonces debemos ver la manera de crear grupos por persona (entendiéndose que en cada grupo se encuentran los registros "detalle", es decir, las materias y sus evaluaciones)

    GROUP BY
      pers.idPersona, pers.cedula, pers.nombre


    Bien, tenemos las tablas relacionadas y hemos agrupado la información por Persona, ahora lo que requerimos es saber las personas con mayor cantidad de evaluaciones, entonces lo que necesitamos es mostrar (en la lista de selección) los datos de la persona y la cuenta de evaluaciones que tiene cada persona.

    SELECT
      pers.idPersona, pers.cedula, pers.nombre, COUNT(*) AS [CantidadEvaluaciones]


    El ejercicio no plantea algún TOP de personas con la mayor cantidad de evaluaciones, por tanto, mostraremos un TOP 10. Ahora, yo te había comentado que trabajaremos según el orden de como procesa las consultas el procesador de consultas (FROM, WHERE, GROUP BY, SELECT, ORDER BY, TOP). Si te das cuenta, ORDER BY está luego de SELECT, lo que nos permite poder ordenar por una expresión y no necesariamente una columna, ¿y cuál es la expresión?, pues [CantidadEvaluaciones]

    ORDER BY
      CantidadEvaluaciones DESC


    Por último, TOP está luego de ORDER BY, ¿por qué? precisamente porque TOP trabaja en conjunto con ORDER BY para limitar las filas según el orden.

    TOP (10) WITH TIES

    Listo!, espero que esta explicación te sirva para refrescar tus conocimientos en t-sql, ya queda de trabajo que unas los trozos de código, no creo que necesites ayuda en ello, ¿verdad?.

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.


    Willams Morales
    Arequipa - PERÚ

    viernes, 31 de julio de 2015 18:10

Todas las respuestas

  • Hola

    Solo te interesa obtener los 3 alumnos con la mayor cantidad de evaluaciones?

    viernes, 31 de julio de 2015 17:58
  • Hola AnalistaStr,

    Lo primero que tienes que hacer es recrear el modelo de tablas "in-memory". Entonces, verás que las evaluaciones corresponden a ciertas materias y las materias son cursadas por ciertas personas. Lo que necesitamos primero es poder relacionar las tablas y para ello haremos uso de INNER JOIN. Lo haremos paso a paso tal y como lo haría el procesador de consultas.

    Personas AS pers
    INNER JOIN Asignados AS asig ON (asig.idPersona = pers.idPersona)
    INNER JOIN Evaluaciones AS eval ON (eval.codMateria = mate.CodMateria)


    Con esto ya tenemos  relacionadas todas las tablas que requerimos para dar solución al problema. Tenemos todas  las Personas [Personas] que están asignadas a un curso [Asignados] y de las materias relacionadas con la persona tenemos sus evaluaciones [Evaluaciones]. Pero, la combinación generará varias filas según materias y evaluaciones tenga la persona, pero como el objetivo es sólo mostrar la cantidad de evaluaciones por persona entonces debemos ver la manera de crear grupos por persona (entendiéndose que en cada grupo se encuentran los registros "detalle", es decir, las materias y sus evaluaciones)

    GROUP BY
      pers.idPersona, pers.cedula, pers.nombre


    Bien, tenemos las tablas relacionadas y hemos agrupado la información por Persona, ahora lo que requerimos es saber las personas con mayor cantidad de evaluaciones, entonces lo que necesitamos es mostrar (en la lista de selección) los datos de la persona y la cuenta de evaluaciones que tiene cada persona.

    SELECT
      pers.idPersona, pers.cedula, pers.nombre, COUNT(*) AS [CantidadEvaluaciones]


    El ejercicio no plantea algún TOP de personas con la mayor cantidad de evaluaciones, por tanto, mostraremos un TOP 10. Ahora, yo te había comentado que trabajaremos según el orden de como procesa las consultas el procesador de consultas (FROM, WHERE, GROUP BY, SELECT, ORDER BY, TOP). Si te das cuenta, ORDER BY está luego de SELECT, lo que nos permite poder ordenar por una expresión y no necesariamente una columna, ¿y cuál es la expresión?, pues [CantidadEvaluaciones]

    ORDER BY
      CantidadEvaluaciones DESC


    Por último, TOP está luego de ORDER BY, ¿por qué? precisamente porque TOP trabaja en conjunto con ORDER BY para limitar las filas según el orden.

    TOP (10) WITH TIES

    Listo!, espero que esta explicación te sirva para refrescar tus conocimientos en t-sql, ya queda de trabajo que unas los trozos de código, no creo que necesites ayuda en ello, ¿verdad?.

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.


    Willams Morales
    Arequipa - PERÚ

    viernes, 31 de julio de 2015 18:10