SQL - Duda acerca de una consulta en SQL en ORACLE

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 37 puestos en SQL (en relación al último mes)
Gráfica de SQL

Duda acerca de una consulta en SQL en ORACLE

Publicado por Jesus (1 intervención) el 21/02/2019 14:27:16
Hola estoy algo atascado con esta consulta. Si alguien me pudiese decir en que falla o como se podria hacer se lo agradeceria.

Nombre del jefe de departamento del que dependen directamente mayor número de empleados, así como el número de empleados que dependen de él. Téngase en cuenta que hay empleados que son jefes de más de un departamento.

1
2
3
4
5
6
7
8
9
SELECT E.nomem, COUNT(*)
FROM temple E, tdepto D
WHERE D.numde = E.numde
GROUP BY E.nomem, D.direc
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
                                    FROM tdepto, temple
                                    WHERE tdepto.numde = temple.numde
                                    GROUP BY tdepto.direc)
;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Duda acerca de una consulta en SQL en ORACLE

Publicado por leonardo_josue (1173 intervenciones) el 21/02/2019 18:45:31
Hola Jesus:

No puedes aplicar en una misma consulta dos funciones de agregación (MAX, COUNT), ya que ambas necesitan de evaluar completamente la tabla para "existir", entonces, esto está mal;

1
2
3
4
SELECT MAX(COUNT(*))
FROM tdepto, temple
WHERE tdepto.numde = temple.numde
GROUP BY tdepto.direc;

Aquí tienes que hacerlo en dos pasos: primero debes de encontrar cuántos empleados tienes cada departamento (es decir, sólo el COUNT), y después, sobre esa consulta obtienes el máximo. para esto puedes hacerlo también de varias formas. En estos momentos no tengo una BD's de ORACLE para probar, pero te pongo la idea de cómo sería en MySQL para que encuentres la equivalencia:

Supongamos una tabla así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM tabla;
+--------+----------------+------------+
| jefe   | departamento   | empleado   |
+--------+----------------+------------+
| jefe 1 | departamento 1 | empleado 1 |
| jefe 1 | departamento 1 | empleado 2 |
| jefe 1 | departamento 1 | empleado 3 |
| jefe 1 | departamento 1 | empleado 4 |
| jefe 1 | departamento 2 | empleado 5 |
| jefe 1 | departamento 2 | empleado 6 |
| jefe 1 | departamento 2 | empleado 7 |
| jefe 2 | departamento 3 | empleado 8 |
| jefe 2 | departamento 3 | empleado 9 |
+--------+----------------+------------+
9 rows in set (0.00 sec)

entonces, para obtener el número de empleados por departamento, lo hacemos con un COUNT simple:

1
2
3
4
5
6
7
8
9
mysql> SELECT COUNT(1) total_empleados FROM tabla GROUP BY departamento;
+-----------------+
| total_empleados |
+-----------------+
|               4 |
|               3 |
|               2 |
+-----------------+
3 rows in set (0.00 sec)

Entonces, para obtener el MAXIMO de empleados, lo puedes hacer con subconsultas:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT MAX(total_empleados) max_total
    -> FROM
    -> (  SELECT COUNT(1) total_empleados
    ->    FROM tabla
    ->    GROUP BY departamento) T;
+-----------+
| max_total |
+-----------+
|         4 |
+-----------+
1 row in set (0.00 sec)

O bien, si lo prefieres, ordenas los registros de mayor a menor y muestras sólo el primero:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT COUNT(1) total_empleados
    -> FROM tabla
    -> GROUP BY departamento
    -> ORDER BY total_empleados desc
    -> LIMIT 1;
+-----------------+
| total_empleados |
+-----------------+
|               4 |
+-----------------+
1 row in set (0.00 sec)
´

Entonces ahora si podrías usar eso en la sección HAVING para filtrar tu consulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT jefe, departamento, count(1) total_empleados
    -> FROM tabla
    -> GROUP BY jefe, departamento
    -> HAVING COUNT(1) = (
    ->    SELECT COUNT(1) total_empleados
    ->    FROM tabla
    ->    GROUP BY departamento
    ->    ORDER BY total_empleados desc
    ->    LIMIT 1
    -> );
+--------+----------------+-----------------+
| jefe   | departamento   | total_empleados |
+--------+----------------+-----------------+
| jefe 1 | departamento 1 |               4 |
+--------+----------------+-----------------+
1 row in set (0.00 sec)

Finalmente una recomendación: en lugar de listar tus tablas en el FROM y hacer las uniones en el WHERE, utiliza los JOIN's, es decir, en lugar de esto:

1
2
3
4
...
FROM tabla1, tabla2
WHERE tabla1.campo = tabla2.campo
....

haz esto:

1
2
3
4
...
FROM tabla1
INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
...

Haz la prueba y nos comentas.

saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar