Jump to content

[Resolvido] Contar maximo ocorrencias de string


dec0

Recommended Posts

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

Link to comment
Share on other sites

Está resolvido pessoal 😄

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 😄

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

Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
  • Vote 1
Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Olá 😄

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
Link to comment
Share on other sites

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
Link to comment
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.