SELECT para retornar o tipo de serviço com mais registros

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
atila_sant
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sex, 30 Mar 2012 4:21 pm

Olá galera, acho q esse é bem simples e um pessoa com um pouco mais de experiência já possa me ajudar.

Seguinte tenho uma tabela que armazena os meus serviços e os serviços tem os seus devidos tipos, estava tentando trazer o tipo do serviço que contém mais registros na minha tabela, a query que estava testando era a seguinte:

Selecionar tudo

SELECT   codigo_servico, COUNT(*)
FROM servico a, (
  SELECT MAX(COUNT(*)) QTD
  FROM   servico
  GROUP BY codigo_servico ) b
HAVING COUNT(*) = b.QTD
E é retornado o erro ORA-00979 de que não é uma expressão GROUP BY

Tentei diversas formas mas esta foi a que fez mais sentido pra min...porém sem sucesso.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Cara,

acho que você ainda não entendeu bem com ofunciona o group by e suas funções.
No seu select, o erro informado é porque no seu select mais externo: exist um count(*),não exist um group by e ainda exist um having.
Dá uma estudada nos seguintes links:
http://psoug.org/reference/group_by.html
http://docs.oracle.com/cd/E17952_01/ref ... tions.html

Aqui no fórum um exemplo semelhante recente:
http://glufke.net/oracle/viewtopic.php? ... 813#p34813
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Acho que poderia ser algo assim:

Selecionar tudo

select max(count(*)) keep (dense_rank last order by count(*)) qtd,
       max(s.codigo_servico) keep (dense_rank last order by count(*)) codigo_servico
  from servico s
 group by s.codigo_servico;
marlonsc
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 28 Ago 2012 4:33 pm
Localização: São Paulo
Contato:

Atila,

Este código consegue retornar o seu dado de forma simples, com o group by do Noctifero e ROWNUM para filtrar o codigo_servico com o maior número de registros:

Selecionar tudo

SELECT * FROM (
SELECT codigo_servico, COUNT(*) QTD
FROM servico a b
GROUP BY codigo_servico
ORDER BY 2 DESC )
WHERE ROWNUM = 1;
Saudações,

Marlon Costa
http://www.marlonscdba.com
Responder
  • Informação