1
votes

Rechercher un service avec un nombre maximum d'employés dans Oracle SQL

J'ai ces deux tableaux et je dois trouver le nom du service avec le nombre maximum d'employés.

Les autres solutions n'étaient pas pour Oracle, donc je poste cette question. De plus, il serait vraiment utile que la requête puisse être expliquée en détail car j'ai du mal à la visualiser.

DEPT_NAME
Production
Marketing

Jusqu'à présent, j'ai réussi à obtenir le plus grand nombre de des employés. Je me demandais donc si je pouvais en quelque sorte écrire une autre sous-requête où je compte à nouveau les employés des départements et les compare au max_num_emp que j'ai calculé dans la première requête.

C'est la requête qui récupère nombre maximum d'employés. Il ne renvoie pas le dept_no.

select count(dept_no)
from employee
group by dept_no
order by count(dept_no) desc
fetch first row only;

Sortie attendue

EMPLOYEE

EMPNO EMPNAME MANAGER SALARY DEPT_NO
1     Puja    6       30000  2
2     Purabi  1       15000  3
3     Barun   6       23000  2
4     Sudha   1       20000  1
5     Amal    2       20000  1
6     Rakesh  3       30000  4

DEPARTMENT

Dept_No Dept_Name  Location
1       Production LaneA
2       Marketing  LaneB
3       Sales      LaneC
4       HR         LaneD

Je peux également ajouter la colonne dept_no dans la requête, alors je devrais en quelque sorte trouver comment obtenir le maximum et cela me donnait en quelque sorte des erreurs parce que la requête enfreignait certaines règles. J'avais en fait essayé de faire max ( requête ci-dessus ).

J'ai donc pensé à simplement obtenir le nombre maximum d'employés, puis à déterminer tous les départements qui ont ces nombreux employés et afficher leur nom.


2 commentaires

Qu'avez-vous essayé? Peut-être avez-vous une requête qui obtient le nombre d'employés par service, par exemple.


Je l'ai ajouté. Veuillez vérifier la question modifiée.


3 Réponses :


3
votes

Vous avez une requête de travail que vous devez joindre à la table department:

select d.dept_name 
from department d inner join (
  select x.dept_no from (
    select dept_no, rank() over (order by count(*) desc) rn
    from employee
    group by dept_no
    order by count(dept_no) desc
  ) x
  where x.rn = 1
) t
on t.dept_no = d.dept_no

Modifier
Essayez ceci (je ne peux pas l'essayer):

select d.Dept_Name   
from department d inner join (
  select dept_no
  from employee
  group by dept_no
  order by count(*) desc
  fetch first row only
) t
on t.dept_no = d.dept_no


8 commentaires

Salut, la requête fonctionne parfaitement, mais comment afficher uniquement la colonne dept_name? J'ai besoin d'une seule colonne dans la sortie. Merci!


Salut, il montre juste dept_name maintenant, mais il y a 2 départements qui ont un maximum d'employés. Il n'en montre qu'un pour l'instant.


C'est ce que fait chercher la première ligne uniquement dans votre code.


Vous pouvez vérifier pourquoi j'ai ajouté cette clause dans ma requête à la fin de la question. J'ai clairement expliqué que c'était parce que je ne pouvais pas faire fonctionner la fonction max () .


Il affiche uniquement la production.


J'ai supprimé récupérer la première ligne uniquement maintenant. Réessayer


Ça marche maintenant. Merci beaucoup! Cela me prendra du temps pour le comprendre. Quoi qu'il en soit, j'ai accepté votre réponse.


Bien si cela fonctionnait. Vérifiez ces éléments: docs.oracle.com/cd/B19306_01/server .102 / b14200 / functions123.‌ htm et techonthenet.com/oracle /functions/rank.php



0
votes

Si vous ne recherchez pas de doublons, alors:

select d.dept_name, count(*)
from department d join
     employee e
     on d.dept_no = e.dept_no
group by d.dept_no, d.dept_name
order by count(dept_no) desc
fetch first row only;


1 commentaires

J'ai besoin de tous les noms de service qui ont le nombre maximum d'employés.



2
votes

Vous avez peut-être utilisé la syntaxe FETCH..FIRST en utilisant WITH TIES au lieu de ONLY .

SELECT d.dept_name
  FROM department d 
   JOIN employee e ON d.dept_no = e.dept_no
GROUP BY d.dept_name
ORDER BY COUNT(*) 
DESC FETCH FIRST 1 ROW WITH TIES ;

Démo


1 commentaires

C'est une solution tellement plus simple. Merci!