Jump to content

Recommended Posts

Posted

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

Posted

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
Posted

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
Posted

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
Posted

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 😄

Posted

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

Posted

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)

Posted (edited)

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
Posted (edited)

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 😄

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

(começa a cheirar a férias 😛 )

Edited by dec0
Posted

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
Posted

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)

Posted (edited)

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
Posted (edited)

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
Posted

Bom defendi hoje o meu trabalho e correu 5* 😄 !!

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

Obrigado pela ajuda 😄

Por mim,

Tópico Encerrado

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.