Consulta sql

Tengo 2 tablas, la tabla escuelas y la tabla profes, con los respectivos campos. Tabla escuelas: codesc, nomesc.
Tabla profes: codesc, codcat, codprof, nomprof, sueldo.
En escuelas codesc es el código de la escuela, nomesc es el nombre de la escuela. En profes, codesc es el código de la escuela a la cual pertenece el profesor, codcat es el código de la categoría del profesor, codprof es el código del profesor, nomprof seria el nombre del profesor, y sueldo, el sueldo que se gana. Debo hacer una consulta en sql que me muestre en cada escuela el nombre de la escuela y el nombre del profesor que más se repite en esa escuela.
Solo se según me dijeron que se debe agrupar por 2 campos (nomesc y nomprof)

3 Respuestas

Respuesta
1
1° Paso: Antes que nada debo decirte que sería conveniente que las categorías
estén dentro de otra tabla, según como lo veo debiera quedar así: tProfesores, tEscuelas, tCategorias, tListado.
En la tabla tListado debiera quedar el listado de profesores con su respectiva categoría y escuela.
2° Paso: Esta query es sobre la tabla Profesores, aquí obtendrás un listado de todos los profesores que se encuentren en la tabla.
Select Count(*) as Repetido, NomProf, CodEsc from tProfesores
3° Paso: Para poder ordenarlo, es necesario agregar dos sentencias: ORDER BY y TOP 100 PERCENT, te recomiendo probar la query sin estas dos para que te des cuenta porque son necesarias.
Select TOP 100 PERCENT Count(*) as VecesRepetido, NomProf, CodEsc from tProfesores
group by NomProf, CodEsc
order by VecesRepetido
4° Paso: Aquí tienes la query lista, al estar ordenado, solo le agrego un alias a la subquery y realizo un SELECT TOP 1, de esta forma obtienes el más repetido.
Select top 1 V.NomProf, V.CodEsc FROM
(Select TOP 100 PERCENT Count(*) as VecesRepetido, NomProf, CodEsc from tProfesores
group by NomProf, CodEsc
order by VecesRepetido) V
Respuesta
1
No es fácil este tipo de consultas...
En principio prueba con esto:
SELECT e.nomesc, p.nomprof
FROM Escuelas e, Profes p
WHERE e.codesc=p.codesc
GROUP BY e.nomesc, p.nomprof
HAVING Count(*) IN (Select MAX(Count(*)) FROM Escuelas e2, Profes p2 WHERE e2.codesc=p2.codesc AND e.codesc=e2.codesc
GROUP BY e2.codesc,p2.nomprof)
Pero no creo que te funcione ya que no se permite usar funciones de SQL dentro de una función MAX()...
Si no funciona, prueba con este truquillo:
SELECT e.nomesc, p.nomprof
FROM Escuelas e, Profes p
WHERE e.codesc=p.codesc
GROUP BY e.nomesc, p.nomprof,e.codesc
HAVING count(*) in (select top 1 count(*)
from profes p2, escuelas e2
where e2.codesc = p2.codesc
and e2.codesc = e.codesc
group by e2.nomesc,p2.nomprof
Order by count(*) desc)
Se me olvidaba...
Añade al final Order By e.codesc si quieres tenerlo bien ordenado por código de escuela.
Respuesta
1
Con esta consulta debería funcionarte:
select escuela, profesor
from (
select nomesc as escuela, nomprof as profesor, count(nomprof) as contador
from escuelas e, profes p
where e.codesc = p.codesc
group by nomesc, nomprof), escuelas esc
where esc.nomesc = escuela
and contador = (select max(count(nomprof)) from escuelas e, profes p where e.codesc = p.codesc group by nomesc, nomprof)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas