dec0 Posted May 30, 2013 at 11:19 AM Report #509739 Posted May 30, 2013 at 11:19 AM 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 ! 😄
legd1991 Posted May 30, 2013 at 11:24 AM Report #509743 Posted May 30, 2013 at 11:24 AM 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
nelsonr Posted May 30, 2013 at 11:30 AM Report #509748 Posted May 30, 2013 at 11:30 AM 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 1 Report
AntonioMateus Posted May 30, 2013 at 01:56 PM Report #509829 Posted May 30, 2013 at 01:56 PM 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 1 Report
dec0 Posted May 30, 2013 at 08:44 PM Author Report #510054 Posted May 30, 2013 at 08:44 PM 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 😄
legd1991 Posted May 30, 2013 at 10:26 PM Report #510093 Posted May 30, 2013 at 10:26 PM 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
dec0 Posted June 4, 2013 at 10:16 AM Author Report #510844 Posted June 4, 2013 at 10:16 AM 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)
legd1991 Posted June 4, 2013 at 10:20 AM Report #510846 Posted June 4, 2013 at 10:20 AM Qual o erro que dá?
legd1991 Posted June 4, 2013 at 11:13 AM Report #510860 Posted June 4, 2013 at 11:13 AM (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 June 4, 2013 at 11:14 AM by legd1991 1 Report
dec0 Posted June 4, 2013 at 11:27 AM Author Report #510869 Posted June 4, 2013 at 11:27 AM (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 June 4, 2013 at 11:36 AM by dec0
legd1991 Posted June 4, 2013 at 11:52 AM Report #510886 Posted June 4, 2013 at 11:52 AM 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
AntonioMateus Posted June 4, 2013 at 07:33 PM Report #511041 Posted June 4, 2013 at 07:33 PM 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 1 Report
dec0 Posted June 5, 2013 at 02:24 PM Author Report #511150 Posted June 5, 2013 at 02:24 PM 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)
AntonioMateus Posted June 6, 2013 at 12:14 AM Report #511259 Posted June 6, 2013 at 12:14 AM 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.
dec0 Posted June 6, 2013 at 10:12 AM Author Report #511303 Posted June 6, 2013 at 10:12 AM (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 June 6, 2013 at 10:13 AM by dec0
AntonioMateus Posted June 7, 2013 at 12:16 PM Report #511507 Posted June 7, 2013 at 12:16 PM (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 June 8, 2013 at 06:40 PM by AntonioMateus 1 Report
dec0 Posted June 13, 2013 at 08:41 PM Author Report #512756 Posted June 13, 2013 at 08:41 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now