Pegar menor valor da tabela, porém...
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:
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
Curtidas 0
Respostas
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!
Quem puder me dar uma luz, fico muito agradecido!
Valeu!
GOSTEI 0
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;
SELECT * FROM boletim A,( SELECT aluno,Min(notas1) FROM boletim GROUP BY aluno) B WHERE A.aluno = B.aluno;
GOSTEI 0
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:
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
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.
Passa a estrutura da(s) tabela(s) onde contém os dados que você nos forneceu.
Para assim podermos ajudar melhor.
GOSTEI 0
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]
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
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.
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
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:
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
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
tente assim:
Select aluno,turma,curso,periodo,Min(notas1) as notas from aluno group by aluno,turma,curso,periodo
GOSTEI 0
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?!
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
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
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:
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
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].
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
18/09/2008
Você prescisa exibir quantos alunos os 10 piores?
Tente colocar select FIRST 10 ....
Criar um VIEW tambem pode ajudar.
Tente colocar select FIRST 10 ....
Criar um VIEW tambem pode ajudar.
GOSTEI 0
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:
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
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
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