Fórum Retornar vários linhas em uma só conforme condição - Stored Procedure #401633
24/05/2011
0
Estou desenvolvendo um aplicativo com firebird e gostaria de saber se voces poderiam me orientar como fazer o seguinte utilizando stored procedure:
Tenho uma tabela de horarios de aula do aluno, cada aula possui 50min de duracao. Gravo dessa forma no banco:
Tabela aulas do aluno
--------------------------------------------------
DTHRINI PROFESSOR
--------------------------------------------------
23/05/2011 08:00 JOAO
23/05/2011 08:50 JOAO
23/05/2011 09:40 JOAO
24/05/2011 07:00 JOSE
24/05/2011 07:50 JOSE
24/05/2011 13:00 JOSE
--------------------------------------------------
Como eu conseguiria retornar essas aulas em um unico registro quando as aulas fossem sequenciais, ou seja, (qnd o termino da aula anterior fosse o inicio da segunda, etc) e o professor for o mesmo. Gostaria que fosse retornado da seguinte forma:
--------------------------------------------------------
QNT DTHRINI PROFESSOR
-------------------------------------------------------
3 23/05/2011 08:00 JOAO
2 24/05/2011 07:00 JOSE
1 24/05/2011 13:00 JOSE
Agradeço qualquer ajuda! Obrigado!
Marcos Doni
Curtir tópico
+ 0Posts
25/05/2011
Wilson Junior
SELECT * FROM NOME_TABELA WHERE Professor = 'JOSE' ORDER BY DtHrIni
Espero ter colaborado.
Gostei + 0
25/05/2011
Rafael Mattos
select cast(DTCADASTRO as date), PROFESSOR, count(*) from AULAS group by cast(DTCADASTRO as date),PROFESSOR
Gostei + 0
25/05/2011
Emerson Nascimento
create procedure horario_aluno (
aluno varchar(40))
returns (
num_aulas smallint,
data timestamp,
prof varchar(40))
as
declare variable dtant timestamp;
declare variable profant varchar(40);
declare variable intervalo integer;
declare variable dthrini timestamp;
declare variable dtultimo timestamp;
declare variable professor varchar(40);
begin
select first 1 dthrini, professor, 1
from horario
where aluno = :aluno
order by dthrini
into :dtant, :profant, :num_aulas;
dtultimo = dtant;
for select dthrini, professor
from horario
where aluno = :aluno and dthrini > :dtant
order by dthrini
into :dthrini, :professor
do
begin
intervalo = cast((:dthrini - :dtultimo) * 60 * 24 as integer);
dtultimo = dthrini;
if ((intervalo <> 50) or (:professor <> :profant)) then
begin
data = dtant;
prof = profant;
suspend;
profant = professor;
dtant = dthrini;
num_aulas = 1;
end
else
num_aulas = num_aulas + 1;
end
data = dtant;
prof = profant;
suspend;
end
Gostei + 0
27/05/2011
Marcos Doni
Mas o quem realmente compreendeu minha dúvida foi o Emerson.
Muito obrigado mesmo. Eu havia feito uma outra rotina, mas nao esta dando certo. Obrigado!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)