Retornar vários linhas em uma só conforme condição - Stored Procedure

Firebird

24/05/2011

Olá pessoal,

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

Marcos Doni

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

24/05/2011

Pelo que entendi, acho que deve ser isto:
SELECT
  *
FROM
  NOME_TABELA
WHERE
  Professor = 'JOSE'
ORDER BY
  DtHrIni


Espero ter colaborado.
GOSTEI 0
Rafael Mattos

Rafael Mattos

24/05/2011

vc vai ter que usar group para isso eu coloquei o cast transformando TIMESTAMP para date pq senão o group vai fazer errado

select cast(DTCADASTRO as date), PROFESSOR, count(*) from AULAS
group by cast(DTCADASTRO as date),PROFESSOR

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/05/2011

tente com esta stored procedure. fiz na correria aqui. veja se vai funcionar com todos os seus casos:

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
Marcos Doni

Marcos Doni

24/05/2011

Agradeço a todos que responderam.

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
POSTAR