Ir para conteúdo
Fórum Script Brasil

Abel Bueno

Membros
  • Total de itens

    3
  • Registro em

  • Última visita

Tudo que Abel Bueno postou

  1. 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
  2. Provavelmente porque em Teste 2 e Teste 5 pai e filho têm o mesmo código. Qual é a chave primária dessa tabela ? Não tem sentido 1 filho ter dois pais. (Como Teste 2 e Teste 3)
  3. Insira um sinal de acordo com o tipo de operação: 1 para entrada, -1 para saída, por exemplo: SELECT SUM( quantidade * CASE tipo WHEN 'S' THEN -1 ELSE 1 END ) FROM movimento
×
×
  • Criar Novo...