Ir para conteúdo
Fórum Script Brasil
  • 0

Faltas consecutivas


Fernandinha

Pergunta

3 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...