Jump to content
Fórum Script Brasil
  • 0

Faltas consecutivas


Fernandinha

Question

3 answers to this question

Recommended Posts

  • 0

Boa tarde Fernandinha,

Para procurar quem teve mais de 7 faltas: agrupamento por aluno, count na frequência=ausencia, no final da sintaxe group by, colocar o having count(frequencia)>=7.

Até ai tudo bem... mas o problema será identificar a sequência destas faltas. Se elas tiverem que ser consecutivas, terá q identificar um campo que tenha esta cronologia.

Se por exemplo for a data da aula ou data da inserção, terá q fazer uma verificação na data para identificar se entre uma e outra ausência, não tenha nenhuma presença. Aí encontrará a consecutividade...

Link to comment
Share on other sites

  • 0

Apenas dando um exemplo do que o fulvio disse:

select
    a.nome
from
    aluno a
    join frequencia f on f.idAluno = a.idAluno
where
    f.data between '2011/09/01' and '2011/09/30'
having
    count(f.falta) >= 7

qualquer coisa diz aí

Link to comment
Share on other sites

  • 0

Acho que após esse tempo você já se virou de algum jeito, mas vou dar uma sugestão aqui como referência.

Podemos levar em consideração as datas em que houve mudança de estado (presença para falta, falta para presença), para contar as consecutivas.

Considerando a seguinte tabela:

create table presenca
(
    aluno varchar(50),
    data_aula date,
    presente char(1) check (presente in ('S','N'))    
);
Simplista, para facilitar o exemplo. Considerando o seguinte conjunto de dados:
insert into presenca

select 'abel', GETDATE() + 0, 'S' union
select 'abel', GETDATE() + 1, 'S' union
select 'abel', GETDATE() + 2, 'S' union
select 'abel', GETDATE() + 3, 'S' union

select 'bruno', GETDATE() + 0, 'S' union
select 'bruno', GETDATE() + 1, 'N' union
select 'bruno', GETDATE() + 2, 'S' union
select 'bruno', GETDATE() + 3, 'N' union
    
select 'carlos', GETDATE() + 0, 'S' union
select 'carlos', GETDATE() + 1, 'S' union
select 'carlos', GETDATE() + 2, 'N' union
select 'carlos', GETDATE() + 3, 'N' union    

select 'daniel', GETDATE() + 0, 'N' union
select 'daniel', GETDATE() + 1, 'S' union
select 'daniel', GETDATE() + 2, 'N' union
select 'daniel', GETDATE() + 3, 'N' union

select 'eduardo', GETDATE() + 0, 'S' union
select 'eduardo', GETDATE() + 1, 'N' union
select 'eduardo', GETDATE() + 2, 'N' union
select 'eduardo', GETDATE() + 3, 'N' union

select 'fernando', GETDATE() + 0, 'N' union
select 'fernando', GETDATE() + 1, 'N' union
select 'fernando', GETDATE() + 2, 'N' union
select 'fernando', GETDATE() + 3, 'S'
Vou contar aqui 3 faltas consecutivas apenas (mais fácil para inserir os dados de exemplo). Pela nossa regra apenas eduardo e fernando tiveram 3 ausencias consecutivas. Temos daniel que faltou 3 vezes, mas teve uma presença no meio. A sacada, como dito antes, é identificar para cada linha, quando houve mudança de estado:
select 
        aluno, 
        presente, 
        data_aula,
        isnull(( 
            select min(data_aula) 
            from presenca p1 
            where p1.aluno = p.aluno 
            and p1.presente != p.presente 
            and p1.data_aula > p.data_aula 
        ), '9999-12-31') data_mudanca
    from    
        presenca p
Em data_mudanca teremos a data que ele passou a frequentar se estava faltando e passou a faltar se estava frequentando. Com esses dados, fazemos um agrupamento , aplicando as regras:
select 
    p2.aluno,
    p2.presente,
    p2.data_mudanca,
    COUNT(*) qtd
from
    (
    select 
        aluno, 
        presente, 
        data_aula,
        isnull(( 
            select min(data_aula) 
            from presenca p1 
            where p1.aluno = p.aluno 
            and p1.presente != p.presente 
            and p1.data_aula > p.data_aula 
        ), '9999-12-31') data_mudanca
    from    
        presenca p
    ) as p2
where
    presente = 'N' -- estou interessado nas faltas    
group by
    p2.aluno,
    p2.presente,
    p2.data_mudanca
having
    count(*) >= 3 -- 3 ou mais consecutivas

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...