Fórum Pegar menor valor da tabela, porém... #364066
18/09/2008
0
Gostaria de pegar o menor valor de uma tabela, sendo que eu preciso mostrar todos os campos da tabela. Inicialmente tentei:
Select aluno,Min(notas1) as notas from boletim group by aluno.
funcionou perfeitamente porém, nao tenho os códigos de turma,curso,periodo,código do aluno,disciplina que ele tirou a menor nota e eu preciso deles para montar um relatório.
Se eu acrescentar estes campos no select, nao funciona conforme deveria e trás todas as disciplinas, sendo elas com notas baixas ou nao.
Alguém pode me dar uma :idea: luzinha?!
Ah, USO O FIREBIRD 2.1 com ZEOS.
Agradeço aos que puderem!
P.S: Desculpem-me a falta de TIL, mas meu teclado nao tem e o patrao nao deixa comprar outro, pois o til nao é necessário para executar todo o serviço, segundo ele.... :evil:
Microbios
Curtir tópico
+ 0Posts
18/09/2008
Microbios
Quem puder me dar uma luz, fico muito agradecido!
Valeu!
Gostei + 0
18/09/2008
Adoniram
SELECT * FROM boletim A,( SELECT aluno,Min(notas1) FROM boletim GROUP BY aluno) B WHERE A.aluno = B.aluno;
Gostei + 0
18/09/2008
Microbios
Quaase isso... mas não é!
É assim:
Selectionar todas as colunas da tabela,
Verificar qual é a menor nota de um Aluno
Agrupando pelo nome do aluno
exemplo:
Aluno Disciplina Nota Turma
------------------------------------
Paulo matemática 5,0 5ª Série
Zé Portugues 4,3 5ª Série
Pedro História 1,0 5ª Série
e blábláblá, com todas as outras...
porque varrer uma tabela com + de 15000 registro via while e comparar nota nova com nota anterior, tá cansando...
Obrigado assim mesmo! :wink:
Gostei + 0
19/09/2008
Webjoel
Passa a estrutura da(s) tabela(s) onde contém os dados que você nos forneceu.
Para assim podermos ajudar melhor.
Gostei + 0
19/09/2008
Microbios
Tabela Boletim
TURMA CHAR(1) NOT NULL,
CURSO CHAR(2) NOT NULL,
NOMECURSO VARCHAR(20),
PERIODO CHAR(2) NOT NULL,
CODIGO INTEGER NOT NULL,
ALUNO VARCHAR(40),
POSICAO NUMERIC(2,0),
BLOQUEIO CHAR(1),
CODDISC CHAR(3) NOT NULL,
DISCIPLINA VARCHAR(20),
NOTAS1 NUMERIC(6,2),
NOTAS2 NUMERIC(6,2),
NOTAS3 NUMERIC(6,2),
NOTAS4 NUMERIC(6,2),
NOTAS5 NUMERIC(6,2),
TOTALNOTAS NUMERIC(6,2),
FALTAS1 NUMERIC(3,0),
FALTAS2 NUMERIC(3,0),
FALTAS3 NUMERIC(3,0),
FALTAS4 NUMERIC(3,0),
FALTAS5 NUMERIC(3,0),
TOTALFALTAS NUMERIC(3,0)
Onde eu preciso de [b:e4162a30b2]CADA MENOR NOTA[/b:e4162a30b2] de [b:e4162a30b2]CADA ALUNO[/b:e4162a30b2] por bimestre (identificado como NOTAS1 = 1 bimestre e etc.)!
se eu executar:
[b:e4162a30b2]select aluno,min(nota1) as nota from boletim group by aluno [/b:e4162a30b2]
devolve o RESULTADO que eu quero, porém nao tenho as outras colunas disponíveis que eu preciso, como TURMA, CURSO e PERIODO.
Espero que eu tenha explicado melhor agora, pois na primeira eu nao consegui expor o problema direito. :oops: :oops:
Obrigado![/b]
Gostei + 0
19/09/2008
Wilson Brito
Uma primeira para saber a menor nota, armazena em uma variável e depois faça a outra consulta para vir todos os registros. Aí se você quiser, pode inserir o valor mínimo armazenado na variável para que o mesmo apareça no resultado da consulta.
Gostei + 0
19/09/2008
Microbios
Fazer isso em mais de 15000 registros e 1300 alunos? Separando por turma,curso e período? Ficaria meio estranho, não acha? Minha tabela já tem todos os campos necessários, basta eu conseguir filtrá-la de modo a mostrar a menor nota entre as demais, de cada aluno e aí é só imprimir. Se não tiver jeito de fazer via SQL vou ter que apelar para um WHILE varrendo todo o arquivo e gravando em outro (o que eu acho, na altura do século 21, um absurdo, mas eu não sei como conseguir essa SQL... Jeito deve ter, eu é que não sei, então....). Obrigado pela idéia, de qualquer forma. Tá anotada na lista de idéias a serem pensadas ANTES DO WHILE... rsrsrs... :lol:
Gostei + 0
19/09/2008
Wilson Brito
tente assim:
Select aluno,turma,curso,periodo,Min(notas1) as notas from aluno group by aluno,turma,curso,periodo
Gostei + 0
19/09/2008
Microbios
Nao tem de que se desculpar, colega! :wink:
Assim como voce exemplificou, funciona perfeitamente... porém ainda falta a coluna das disciplinas e se eu acrescentá-la irá aparecer mais de uma nota por aluno já que o group by teria também que ter essa coluna e aí os valores sao diferentes, entende? Seria mesmo dentre TODAS as disciplinas a menor, desde que eu saiba qual disciplina é... Intrínseco, nao? :lol:
Tá complicado de resolver isso via SQL... Vamos ao WHILE entao....
Obrigado, viu?!
Gostei + 0
19/09/2008
Emerson Nascimento
select bl.* from boletim bl where bl.nota1 = (select min(bl2.nota1) from boletim bl2 where bl2.aluno = bl.aluno)
Gostei + 0
19/09/2008
Microbios
Essa funcionou conforme deveria funcionar porééém LENTA que dá dó :lol: Cara. ficou muito lenta, chegando a parar de responder o IBEXPERT. Se eu colocar ainda um order by no final, aí trava por completo. Mas a SQL FUNCIONOUUUU.... e agora??????? :roll:
Gostei + 0
19/09/2008
Emerson Nascimento
você precisa ter, pelo menos, um índice pelo campo [i:0e3d12d01f]aluno[/i:0e3d12d01f].
na verdade deveria ter também índices para os campos que você vai usar no [i:0e3d12d01f]order by[/i:0e3d12d01f] e também para os que você vai usar com a função [i:0e3d12d01f]min()[/i:0e3d12d01f].
Gostei + 0
20/09/2008
Diegotiemann
Tente colocar select FIRST 10 ....
Criar um VIEW tambem pode ajudar.
Gostei + 0
20/09/2008
Microbios
Não cara, eu preciso mostrar TODAS AS NOTAS BAIXAS de TODOS os ALUNOS de TODAS AS TURMAS para relatórios de acompanhamento pedagógicos e coisa e tal, assim sendo, tenho que listar todos alunos e todas disciplinas que os mesmos obtiveram o pior desempenho.
Valeu pela dica, de qualquer forma, e claro, quando eu conseguir uma SQL que funcione perfeitamente vou transformá-la em view mesmo.
:wink:
Gostei + 0
21/09/2008
Microbios
Meu problema foi solucionado! Juntei as idéias de vários colegas e deu nisso aqui:
select distinct
bl.turma,bl.curso, bl.periodo,bl.codigo, bl.aluno, bl.posicao, bl.coddisc, bl.disciplina, bl.notas1
from
boletim bl
where
bl.notas1 = (select min(bl2.notas1)
from boletim bl2
where bl2.codigo = bl.codigo group by bl2.codigo) order by bl.turma, bl.curso,bl.periodo,bl.posicao
o resultado foi o esperado, não houve uma queda de performance e tá tudo OK!
Queria agradecer a todos que colaboraram dando idéias. Valeu turma!!!
:P
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)