Pegar menor valor da tabela, porém...

Delphi

18/09/2008

Olá a todos;

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

Microbios

Curtidas 0

Respostas

Microbios

Microbios

18/09/2008

Uma pequena correção: Não é a menor ou menores notas de uma tabela e sim a menor nota de todos os alunos na tabela. Para que aponte qual são os alunos que precisam de ´puxões de orelha´ dos pais... :lol:

Quem puder me dar uma luz, fico muito agradecido!


Valeu!


GOSTEI 0
Adoniram

Adoniram

18/09/2008

não executei, mas é +- isso:

SELECT * FROM boletim A,( SELECT aluno,Min(notas1) FROM boletim GROUP BY aluno) B WHERE A.aluno = B.aluno;


GOSTEI 0
Microbios

Microbios

18/09/2008

adoniram;

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
Webjoel

Webjoel

18/09/2008

Olá!

Passa a estrutura da(s) tabela(s) onde contém os dados que você nos forneceu.

Para assim podermos ajudar melhor.


GOSTEI 0
Microbios

Microbios

18/09/2008

Ok, WebJoel...

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
Wilson Brito

Wilson Brito

18/09/2008

Porque vc não faz duas consultas?
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
Microbios

Microbios

18/09/2008

wilsondrb;

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
Wilson Brito

Wilson Brito

18/09/2008

Desculpe, não havia entendido sua pergunta.

tente assim:

Select aluno,turma,curso,periodo,Min(notas1) as notas from aluno group by aluno,turma,curso,periodo


GOSTEI 0
Microbios

Microbios

18/09/2008

wilsondrb;

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
Emerson Nascimento

Emerson Nascimento

18/09/2008

tente assim:
select
  bl.*
from
  boletim bl
where
  bl.nota1 = (select min(bl2.nota1)
              from boletim bl2
              where bl2.aluno = bl.aluno)



GOSTEI 0
Microbios

Microbios

18/09/2008

emerson.en;

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
Emerson Nascimento

Emerson Nascimento

18/09/2008

verifique se você tem os índices para os campos que você deseja ordenar/relacionar.

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
Diegotiemann

Diegotiemann

18/09/2008

Você prescisa exibir quantos alunos os 10 piores?

Tente colocar select FIRST 10 ....

Criar um VIEW tambem pode ajudar.


GOSTEI 0
Microbios

Microbios

18/09/2008

diegotiemann;

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
Microbios

Microbios

18/09/2008

Caros colegas;

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
POSTAR