Jump to content
dec0

[Resolvido] Contar maximo ocorrencias de string

Recommended Posts

dec0

Olá pessoal!

Ando com uma query de mssql há 2 dias e não a consigo resolver!

É o seguite:

Tenho uma tabela Piscina que tem vários tipos de piscina onde são feitas análises a bactérias.

O que pretendo é encontrar as piscinas onde a bactéria "X" foi encontrada mais que 5 vezes.

Até agora tenho esta query:

SELECT tipo_piscina, COUNT(bact) FROM Piscina,(SELECT tipo_piscina AS bact FROM Piscina, Analise WHERE Analise.bact_nome='E. coli' AND Piscina.id_piscina=Analise.id_piscina)a GROUP BY Piscina.tipo_piscina

Mas o que dá sempre é o número que essa bactéria foi encontrada nessa piscina..

Alguém me pode dar uma ajuda?

Bem-haja pessoal ! :D

Edited by Rui Carlos
Formatação do código.

Share this post


Link to post
Share on other sites
legd1991

Se usares assim deve funcionar:

SELECT tipo_piscina, COUNT(bact) FROM Piscina,(SELECT tipo_piscina AS bact FROM Piscina, Analise WHERE Analise.bact_nome='E. coli' AND Piscina.id_piscina=Analise.id_piscina)a GROUP BY Piscina.tipo_piscina HAVING COUNT(bact) >5

Share this post


Link to post
Share on other sites
nelsonr

Algo assim?

SELECT * FROM
(
SELECT	
Analise.id_piscina, Analise.bact_nome, count(*) quantidade
FROM		
Analise
INNER JOIN
Piscina ON Analise.id_piscina = Piscina.id_piscina
GROUP BY
Analise.id_piscina, Analise.bact_nome
) AS lista
WHERE bact_nome='E. coli' AND quantidade>=5

  • Vote 1

Share this post


Link to post
Share on other sites
AntonioMateus

Faria algo do género

SELECT
 Piscina.tipo_piscina as TipoPiscina,
 Analise.bact_nome as Bacteria,
 COUNT(*) as NumOcorrencias
FROM		
 Analise
LEFT JOIN
 Piscina ON Piscina.id_piscina = Analise.id_piscina
where
Analise.bact_nome = 'E. coli'
GROUP BY
 Piscina.tipo_piscina, Analise.bact_nome
HAVING COUNT(*) > 5

  • Vote 1

Share this post


Link to post
Share on other sites
dec0

Está resolvido pessoal :D

As duas últimas querys estão porreiras, a primeira não funcionou corretamente :/

O problema é que nós nunca trabalhámos com com InnerJoins e não conseguimos chegar a esta solução...

Muito obrigado pessoal :D

Share this post


Link to post
Share on other sites
legd1991

Está resolvido pessoal :D

As duas últimas querys estão porreiras, a primeira não funcionou corretamente :/

O problema é que nós nunca trabalhámos com com InnerJoins e não conseguimos chegar a esta solução...

Muito obrigado pessoal :D

A que eu te disse apenas me esqueci do >=. Não testei mas quase de certeza que funciona

Share this post


Link to post
Share on other sites
dec0

Pessoal, falta este problema para acabar o trabalho e fico de férias! xD

O objetivo é mostrar o nome do analista que fez mais análises (no geral).

Nós já testámos algumas queries e o que conseguimos é mostrar o número máximo, ou mostrar os analistas com as respetivas análises feitas, ou mostrar o numero máximo de análises feitas mas com todos os analistas...

Nós desconfiamos que o problema está nos "selects"... O ideal era mostrar o máximo de mais_analises como uma coluna, mas dá erro...

Eis a nossa query:

SELECT a.nome, MAX(mais_analises) Numero_analises FROM Analista, (SELECT Analista.nome, COUNT(Analise.id_analise) mais_analises FROM Analista, Analise WHERE Analise.n_analista=Analista.n_analista GROUP BY Analista.nome)a GROUP BY a.nome

-> O que a query faz é mostrar uma lista de analistas com o respetivo número de análises feitas.

O que nós queríamos retirar desta lista era selecionar o nome (e respetivo número de analises) do analista que fez mais análises...

Temos duas tabelas (Análise e Analista), onde na Análise temos n_analista (chave forasteira para a tabela Analise)

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
legd1991

Tenta assim :

SELECT top 1 a.nome, MAX(mais_analises) Numero_analises FROM Analista,
(SELECT Analista.nome, COUNT(Analise.id_analise) mais_analises
FROM Analista, Analise WHERE Analise.n_analista=Analista.n_analista GROUP BY Analista.nome)a order by Numero_analises desc

Edited by legd1991
  • Vote 1

Share this post


Link to post
Share on other sites
dec0

Dá erro... Diz que necessita de um "GROUP BY". No entanto acrescentámos "GROUP BY a.nome" antes de ORDER BY Numero_analises DESC.. E funcionou :D

Vejo aí um "top" isso é para encontrar um mínimo ou máximo?

(começa a cheirar a férias :P )

Edited by dec0

Share this post


Link to post
Share on other sites
legd1991

O top 1 é para te retornar o primeiro que encontra, como depois fazes um order by desc o primeiro vai sempre ser o maior numero de analalises

Share this post


Link to post
Share on other sites
AntonioMateus

Pode-se simplicar um pouco, não é preciso MAX, basta contar e trazer o que tiver maior nº, para isso serve o Top 1 indicado pelo legd1991

SELECT
       top 1
       Analista.nome,
       COUNT(Analise.id_analise) mais_analises
   FROM Analista
       left join Analise on Analise.n_analista=Analista.n_analista
   GROUP BY Analista.nome
   order by COUNT(Analise.id_analise) desc

Edited by Rui Carlos
Formatação do código
  • Vote 1

Share this post


Link to post
Share on other sites
dec0

Bom pessoal tenho que reabrir o tópico...Estive a rever o trabalho com o professor e saiu um novo enunciado que eu não tive acesso e onde foram acrescentadas mais 4 perguntas. Tenho-as todas feitas à excepção de uma, que não tenho noção de como fazer isto!

O objetivo é listar os analistas que fizeram um número de análises superior ao número médio de análises global feitas na empresa.

Não tenho ideias para isto, alguém me pode dar uma ajuda? Eu sigo os mesmos "moldes" que as perguntas acima.

(ser trabalhdor estudante tem as suas desvantagens)

Share this post


Link to post
Share on other sites
AntonioMateus

Podes fazer isso de várias formas. A mais simples é usar o operador avg() http://www.w3schools.com/sql/sql_func_avg.asp

Tens que ter uma query que te de para cada analista o total de analises (olha para as que já tens). Depois sobre esta obténs a média e trazes os que têm nº de analises superior à média.

Primeiro tenta, se tiveres dificuldades coloca aqui a query.

Share this post


Link to post
Share on other sites
dec0

Olá :D

Hoje de manhã antes de ir trabalhar tive que pegar nisto... Dá-me a volta à cabeça! -.-'

Então o que consegui foi isto: (mas retorna o numero total para cada um, mas não era suposto [a meu ver né xD] mostrar a média para cada um, visto usar o AVG ? )

SELECT

b.nome, AVG(b.mais_analises) media FROM(

SELECT

a.nome, mais_analises FROM Analista,

(

SELECT Analista.nome, COUNT(Analise.id_analise) mais_analises

FROM

Analista, Analise WHERE Analise.n_analista=Analista.n_analista GROUP BY Analista.nome)a GROUP BY mais_analises, a.nome

)

b GROUP BY b.mais_analises, b.nome

O prazo para mim trabalhador estudante termina sexta (amanhã).

O pessoal anda todo atarefado com isto... Vai uma mãozinha pessoal ? :)

Obrigado pela ajuda que me estão a dar pessoal! :);)

Edited by dec0

Share this post


Link to post
Share on other sites
AntonioMateus

vê se isto serve:

SELECT
	Analista.nome,
	xAnalise.num_analises
	-- para saber a media global descomentar a linha seguinte
	-- ,((SELECT COUNT(*) FROM Analise) / (SELECT COUNT(*) FROM Analista)) MediaGlobal
FROM Analista
LEFT JOIN
(
-- obtém o nº de analises de cada analista
select n_analista,
cast(count(*) as decimal) num_analises
from Analise
group by n_analista
)
xAnalise ON xAnalise.n_analista=Analista.n_analista
where isnull(xAnalise.num_analises,0) >
(
-- obtém a média global: considerando todos os analistas mesmo os que não tê qq analise
(SELECT COUNT(*) FROM Analise) / (SELECT COUNT(*) FROM Analista)
)
ORDER BY num_analises DESC

Edited by AntonioMateus
  • Vote 1

Share this post


Link to post
Share on other sites
dec0

Bom defendi hoje o meu trabalho e correu 5* :D !!

O professor valorizou a utilização de queries não dadas na aula, valorizando assim a aprendizagem feita "por fora".

Obrigado pela ajuda :D

Por mim,

Tópico Encerrado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.