Fórum select dentro de outro chamando procedure #471958

04/03/2014

0

Pessoal como fazer este select?
A coluna REPROVADO esta com TRUE ou FALSE como faço para contar os alunos que estão com TRUE e os que estão com FALSE, segue abaixo o código:
select codigo_turma, 
         matricula_aluno, 
         mediaglobalanual, 
         mediaglobalfinal, 
         reprovado 
         from proc_reprovados(:cod_escola, :turma) 
Osmar

Osmar

Responder

Posts

05/03/2014

Marisiana Battistella

Bom dia Osmar!

Testei o código a segui com utilizando o nome de uma tabela nas clausulas from que fazer a chamada do proc_reprovados e funcionou,
não sei vai funcionar com o procedimento, talvez precise se alterações...
select rep.reprovados,
       ap.aprovados
from (select COUNT(reprovado) as reprovados
      from proc_reprovados(:cod_escola, :turma)
      where reprovado = 'FALSE') rep,
     (select COUNT(reprovado) as aprovados
      from proc_reprovados(:cod_escola, :turma)
      where reprovado = 'TRUE') ap
group by rep.reprovados,
         ap.aprovados
Responder

Gostei + 0

05/03/2014

Osmar

Bom dia Marisiana,

Não funciona, já que preciso executar primeiro a Proc_Reprovado:

BEGIN 
  FOR 
    Select 
           ALUNOTURMA.codigo_turma, 
           aluno.nome, 
           ALUNOTURMA.matricula_aluno, 
           ALUNOTURMA.numero, 
           ALUNOTURMA.escola, 
           ALUNOTURMA.transferido, 
           ALUNOTURMA.desistente, 
           alunoturma.falecido, 
           alunoturma.abandono 

    from ALUNOTURMA left join aluno on alunoturma.matricula_aluno = aluno.matricula 
    where ALUNOTURMA.ESCOLA = :COD_ESCOLA 
      and ALUNOTURMA.codigo_turma=:turma 
    order by aluno.nome 
    INTO :CODIGO_TURMA, 
         :NOME_ALUNO, 
         :MATRICULA_ALUNO, 
         :NUMERO, 
         :ESCOLA, 
         :TRANSFERIDO, 
         :desistente, 
         :falecido, 
         :abandono 
  DO 
  BEGIN 
    SELECT mediaglobalanual, mediaglobalfinal 
    FROM proc_media_anual(:MATRICULA_ALUNO,:CODIGO_TURMA) 
    into :MEDIAGLOBALANUAL , :mediaglobalfinal; 

   if ((mediaglobalanual < 50) and (mediaglobalfinal < 50)) then 
   reprovado = 'True'; 
   else 
   reprovado = 'False'; 

    SUSPEND; 
  END 
END


para depois executar a outra parte do código calculando o total de aprovados e reprovados da coluna REPROVADO:

select codigo_turma, 
         matricula_aluno, 
         mediaglobalanual, 
         mediaglobalfinal, 
         reprovado 
         from proc_reprovados(:cod_escola, :turma) 
Responder

Gostei + 0

05/03/2014

Marisiana Battistella

Quando você executa esse select, vc consegue obter o retorno do procedimento?

select codigo_turma, 
         matricula_aluno, 
         mediaglobalanual, 
         mediaglobalfinal, 
         reprovado 
         from proc_reprovados(:cod_escola, :turma) 


Responder

Gostei + 0

05/03/2014

Marisiana Battistella

Se retorna valores, você pode tenta executar assim pra ver se dá certo:

select rep.reprovado,
       ap.aprovado
from (select COUNT(r.reprovado) as reprovado
      from (select codigo_turma, 
                   matricula_aluno, 
                   mediaglobalanual, 
                   mediaglobalfinal, 
                   reprovado 
            from proc_reprovados(:cod_escola, :turma)) r      
      where r.reprovado = 'FALSE') rep,
     (select COUNT(a.reprovado) as aprovado
      from (select codigo_turma, 
                   matricula_aluno, 
                   mediaglobalanual, 
                   mediaglobalfinal, 
                   reprovado 
            from proc_reprovados(:cod_escola, :turma)) a 
      where a.reprovado = 'TRUE') ap
group by rep.reprovado,
         ap.aprovado


Responder

Gostei + 0

05/03/2014

Osmar

Poxa funcionou, mim desculpe pela falta de experiência, só que quando fui colocar no formulário não ficou como eu preciso, então alterei a proc_reprovado para mim retornar por Escola e ANO, veja como ficou:

BEGIN 
  FOR 
    Select 
           ALUNOTURMA.codigo_turma, 
           ALUNOTURMA.matricula_aluno, 
           ALUNOTURMA.escola, 
           ALUNOTURMA.transferido, 
           ALUNOTURMA.desistente, 
           alunoturma.falecido, 
           alunoturma.abandono 

    from ALUNOTURMA left join TURMA on alunoturma.codigo_turma = TURMA.codigo 
    where ALUNOTURMA.ESCOLA = :COD_ESCOLA 
      and TURMA.ano         = :ANO 
    INTO :CODIGO_TURMA, 
         :MATRICULA_ALUNO, 
         :ESCOLA, 
         :TRANSFERIDO, 
         :desistente, 
         :falecido, 
         :abandono 
  DO 
  BEGIN 
    SELECT mediaglobalanual, mediaglobalfinal 
    FROM proc_media_anual(:MATRICULA_ALUNO,:CODIGO_TURMA) 
    into :MEDIAGLOBALANUAL , :mediaglobalfinal; 

   if ((mediaglobalanual < 50) and (mediaglobalfinal < 50)) then 
   reprovado = 'True'; 
   else 
   reprovado = 'False'; 

    SUSPEND; 
  END 
END 


então quando executo essa procedure ela mim retorna assim:

CODIGO_TURMA               REPROVADO 
          3                                    True 
          3                                    False 
          3                                    True 
          7                                    False      
          7                                    True 
          9                                    False 
          9                                    True 


então preciso que a o Select que você fez mim retorne assim:

CODIGO_TURMA   QTD_APROVADOS     QTD_REPROVADOS 
           3                          1                                2 
           7                          1                                1 
           9                          1                                1 
Responder

Gostei + 0

05/03/2014

Marisiana Battistella

Imagina, estamos aqui para aprender!

Tenta assim pra ver se dá certo:
select at.codigo_turma,
       rep.reprovado,
       ap.aprovado
from aluno_turma at
left join (select r.codigo_turma,
             COUNT(r.reprovado) as reprovado
      from (select codigo_turma, 
                   matricula_aluno, 
                   mediaglobalanual, 
                   mediaglobalfinal, 
                   reprovado 
            from proc_reprovados(:cod_escola, :turma)) r      
      where r.reprovado = 'FALSE'
      group by r.codigo_turma) rep
on rep.codigo_turma = at.codigo_turma
left join (select ap.codigo_turma,
                  COUNT(a.reprovado) as aprovado
           from (select codigo_turma, 
                        matricula_aluno, 
                        mediaglobalanual, 
                        mediaglobalfinal, 
                        reprovado 
                from proc_reprovados(:cod_escola, :turma)) a 
           where a.reprovado = 'TRUE'
           group by ap.codigo_turma) ap
on ap.codigo_turma = at.codigo_turma
group by at.codigo_turma,
         rep.reprovado,
         ap.aprovado

Responder

Gostei + 0

07/03/2014

Osmar

Boa tarde, tive que formatar minha máquina, olha esta parando na primeira linha em at, mas um amigo acabou resolvendo para mim, veja como ficou o código:

select 
    codigo_turma, 
    count(case when reprovado = 'False' then 1 end) as QtdAprovados, 
    count(case when reprovado = 'Ttrue'  then 1 end) as QtdReprovados 
from proc_reprovados(:cod_escola, :ano) 
group by 
    codigo_turma


Uso report builder, e estou com problema para posicionar corretamente no formulário, porque pego os dados de duas query a query acima pego por COD_ESCOLA e ANO e a segunda pego por ESCOLA, TURMA e ANO, então não se é possível fazer tudo em uma query só, porque resolveria o problema ou talvez exista uma forma de ajustar no próprio formulário, coisa que já fiz várias vezes e não deu certo, aí vai a segunda query:
select t.ano,
       t.grau,
       count (al.matricula_aluno) as qtd_aluno,

    (select
      ((select cast(count(al.matricula_aluno) as numeric(10,4)) as qtd_Transf
         from alunoturma al inner join turma t on al.codigo_turma = t.codigo
          where al.escola           =:escola
                and t.ano           =:ano
                and al.codigo_turma =:turma
                and al.transferido  ='True')
             / count(al.matricula_aluno)  * 100) as Perc_Transf
        from alunoturma al inner join turma t on al.codigo_turma = t.codigo
        where al.escola =:escola
              and al.codigo_turma =:turma),

     (select  count(al.transferido) as qtd_Transferido
        from alunoturma al inner join turma t on al.codigo_turma = t.codigo

          where al.escola              =:escola
             and t.ano                      =:ano
             and al.codigo_turma  =:turma
             and al.transferido        ='True')

     from alunoturma al inner join turma t on al.codigo_turma = t.codigo

where al.escola                  =:escola
      and t.ano                       =:ano
      and al.codigo_turma =:turma
group by   t.ano,
                 t.grau
order by grau








O modelo do formulário deveria ser assim:


Nº ORDEM SÉRIE TRANSFERIDO % TRANSFERIDO QTD_APROV QTD_REP
1 1º ANO 2 2% 20 5
2 2º ANO 0 0 30 3
3 3º ANO 3 5% 45 6


procedure TFrmRel_Indices.IBQryTurmaAfterScroll(DataSet: TDataSet);
begin
  IBQryAlunoTurma.Close;
  IBQryAlunoTurma.ParamByName('escola').AsString  := IBQryTurmaESCOLA.AsString;
  IBQryAlunoTurma.ParamByName('turma').AsString   := IBQryTurmaCODIGO.AsString;
  IBQryAlunoTurma.Open;
end;


Responder

Gostei + 0

07/03/2014

Osmar

Marisiana, bom dia, obrigado por tudo já consegui resolver.
Responder

Gostei + 0

27/05/2014

Nelson Santos

Desenvolva softwares 3D em Delphi 7
www.3dsistemas.com.br
Responder

Gostei + 0

27/05/2014

Marisiana Battistella

Marisiana, bom dia, obrigado por tudo já consegui resolver.


Por nada! Que bom que conseguiu! =)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar