SQL MAX(COUNT())

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Xaninha_1991
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sex, 14 Dez 2012 6:48 pm

Bom dia...

Eu tenho a tabela medico (NumeroOrdemMedicos, Nome, Morada, Sexo, DataNascimento, NumeroBI, IDespecialidade, NumOrdemMedicosChefeEquipa



e a tabela cirurgia( IDCirurgia, DataCirurgia, HoraCirurgia, NumeroSala, NumeroOrdemMedicos, NumeroInternado)



Tenho de responde à pergunta QUAL O NOME DO MÉDICO COM MAIS CIRURGIAS EFECTUADAS?

Eu sei que aplicanco este comando:

select medico.nome, count(idcirurgia)
from cirurgia, medico
where cirurgia.numeroordemmedicos=medico.numeroordemmedicos
group by medico.nome

Consigo o número de cirurgias feitas por caa médico, mas na realidade o que eu quero é o máximo desse count porque quero o médico com o máximo de cirurgias....

Alguém me pode ajudar????
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá 1991,

Haveria mais de uma forma de resolver este problema.

Não posso lhe garantir que a solução abaixo esteja 100% correta ou seja 100% performática. Você precisaria fazer um teste em seu ambiente:

1) Primeiro, tente verificar quantas cirurgias fez cada médico:

Selecionar tudo

 SELECT MEDICO.NOME, 
              COUNT(IDCIRURGIA) AS TOT_CIRURGIAS
         FROM CIRURGIA, 
              MEDICO
        WHERE CIRURGIA.NUMEROORDEMMEDICOS = MEDICO.NUMEROORDEMMEDICOS
        GROUP BY MEDICO.NOME
2) Tente verificar o total máximo de cirurgia que um médico fez (não importa o nome dele):

Selecionar tudo

SELECT MAX(COUNT(IDCIRURGIA)) AS MAX_CIRURGIAS
         FROM CIRURGIA 
        GROUP BY CIRURGIA.NUMEROORDEMMEDICOS
3) Construa uma única querie agora, colocando cada uma das queries acima como SUB-QUERIES da
principal. O que te interessa é listar todos os médicos cujo total de cirurgias seja igual
ao do médico que fez o maior número de cirurgias (lembre-se que pode ocorrer um empate
entre dois ou mais médicos):

Selecionar tudo

SELECT M.NOME,
       M.TOT_CIRURGIAS
  FROM (SELECT MEDICO.NOME, 
              COUNT(IDCIRURGIA) AS TOT_CIRURGIAS
         FROM CIRURGIA, 
              MEDICO
        WHERE CIRURGIA.NUMEROORDEMMEDICOS = MEDICO.NUMEROORDEMMEDICOS
        GROUP BY MEDICO.NOME) M,
       (SELECT MAX(COUNT(IDCIRURGIA)) AS MAX_CIRURGIAS
         FROM CIRURGIA 
        GROUP BY CIRURGIA.NUMEROORDEMMEDICOS) C
 WHERE M.TOT_CIRURGIAS = C.MAX_CIRURGIAS
 ORDER BY M.NOME
Creio que os foristas podem lhe dar outras sugestões para resolver este problema.

Abraços,

Sergio Coutinho
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Dá pra fazer usando funções analíticas:

Selecionar tudo

SELECT MAX (M.NOME)KEEP (DENSE_RANK FIRST ORDER BY TOT_CIRURGIAS DESC NULLS LAST) AS MEDICO_MAIS_CIRURGIAS
  FROM (SELECT   MEDICO.NOME,
                 COUNT (IDCIRURGIA) AS TOT_CIRURGIAS
            FROM CIRURGIA,
                 MEDICO
           WHERE CIRURGIA.NUMEROORDEMMEDICOS = MEDICO.NUMEROORDEMMEDICOS
        GROUP BY MEDICO.NOME) M
Porém assim somente um nome de médico será exibido.
bride
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qua, 24 Set 2008 11:00 pm
Localização: Belo Horizonte - MG
Bride
OCA Oracle PL/SQL Developer Certified Associate

não intendi
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes