SQL - Manera más sencilla de hacer algo tan simple

   
Vista:

Manera más sencilla de hacer algo tan simple

Publicado por dai (2 intervenciones) el 01/06/2013 19:50:39
¡Hola a todos!

Estoy estudiando algo de SQL Standard y me he bloqueado con un medio problema.
Imaginemos una BD simplísima y típica:

- empleado (id, nombre, dpto)
- departamento (id, nombre)

empleado.dpto => departamento.id


Pregunta: ¿Cómo sacar el nombre del departamento con más empleados y la cantidad?

Opcion 1:
1
2
3
4
5
6
7
8
SELECT departamento.nombre
    FROM departamento INNER JOIN departamento.id=empleado.dpto
    WHERE departamento.id = ( SELECT empleado.dpto
        FROM empleado
        GROUP BY COUNT(*)
        HAVING COUNT(*) = ( SELECT MAX(COUNTt(*) )
            FROM empleado
            GROUP BY empleado.dpto) )


Opción 2 (dudo que funcione):
1
2
3
4
5
6
SELECT departamento.nombre
    FROM departamento, empleados
    WHERE (empleado.dpto=departamento.id) AND
       ( SELECT MAX(COUNT(*)
            FROM empleado
            GROUP BY empleado.dpto) )


¡Y todavía me queda por sacar la cantidad!

Lo dicho, estoy medio bloqueado y no lo veo.
Tiene que haber algo más sencillo que todo esto.

Gracias!
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

Manera más sencilla de hacer algo tan simple

Publicado por Saul (6 intervenciones) el 02/06/2013 01:58:33
Pues como no dices que DB estas usando, te lo muestro en MySQL
Ahora bien si es SQL SERVER el similar a LIMIIT es TOP (Es lo único que tendrías que cambiar)

1
2
3
4
5
6
7
8
9
10
11
12
SELECT Id As CodDepto, nombre As NomDepto,
       (
       SELECT COUNT(Id) As TotD
          FROM (
              SELECT a.Id,
                   a.nombre
               FROM departamento a
                  INNER JOIN empleado b ON b.dpto = a.Id) TotD
             WHERE TotD.Id = V.Id
        GROUP BY TotD.Id) aS lTotal
FROM departamento As V
ORDER BY lTotal DESC LIMIT 1;


Suerte Att.

Sha
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Manera más sencilla de hacer algo tan simple

Publicado por dai (2 intervenciones) el 02/06/2013 16:31:36
No se había ocurrido utilizar el TOP y el ORDER.

En principio la BD es exactamente igual.

Gracias!
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

Manera más sencilla de hacer algo tan simple

Publicado por leonardo_josue (878 intervenciones) el 03/06/2013 16:27:22
Hola dai:

La consulta que propone Saul, si bien es correcta, también se puede simplificar... sería asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mysql> SELECT * FROM empleado;
+------+-----------------+------+
| id   | nombre          | dpto |
+------+-----------------+------+
|    1 | empleado uno    |    1 |
|    2 | empleado dos    |    2 |
|    3 | empleado tres   |    3 |
|    4 | empleado cuatro |    1 |
|    5 | empleado cinco  |    2 |
|    6 | empleado seis   |    1 |
+------+-----------------+------+
6 rows in set (0.00 sec)
 
mysql> SELECT * FROM departamento;
+------+----------------+
| id   | nombre         |
+------+----------------+
|    1 | departamento x |
|    2 | departamento y |
|    3 | departamento z |
+------+----------------+
3 rows in set (0.00 sec)
 
mysql> SELECT d.*, e.total
    -> FROM departamento d
    -> INNER JOIN
    -> (  SELECT dpto, COUNT(dpto) total
    ->    FROM empleado
    ->    GROUP BY dpto ) E
    -> ON E.dpto = d.id
    -> ORDER BY e.total DESC
    -> LIMIT 1;
+------+----------------+-------+
| id   | nombre         | total |
+------+----------------+-------+
|    1 | departamento x |     3 |
+------+----------------+-------+
1 row in set (0.00 sec)


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
1
Comentar