Como aplicar o cálculo de frequência de alunos em query MySQL?

MySQL

Banco de Dados

21/07/2018

Olá amigos, boa noite!

Tenho a tabela "frequencia_aluno" no meu BD com os seguintes campos: "ID, ID_ALUNO, ID_TURMA e FREQUENCIA" e gostaria de fazer uma consulta ao campo "FREQUENCIA". Explicando, o campo frequencia armazena apenas 1 dos 3 dados: Presença (P) ou Falta Justificada (FJ) ou Falta (F).

Meu problema está em fazer a contagem no campo "frequencia" para aplicar a fórmula abaixo, ou seja, o aluno de ID 100 já recebeu (hipoteticamente) 10 presenças (P), 2 faltas justificadas (FJ) e 4 faltas (F)... se houver uma possibilidade de fazer um count(*) para identificar esse valores separadamente, vou ter como aplicar a fórmula abaixo:

Freq% = Total_P_FJ_F / 100 x Total_P = X%

Alguém consegue me ajudar nisso?! Serve uma outra sugestão também!!!

Grato desde já!!!
Myller Meireles

Myller Meireles

Curtidas 0

Melhor post

Luiz Santos

Luiz Santos

22/07/2018

Myller

Tem como resolver isso em procedure.
Em uma única query também, mas ela pode ficar lenta.
Não sei dizer se existe a função PIVOT no MySQL.

Tenta isso.

SELECT T.ID_ALUNO
     , SUM(T.P)  AS P
	 , SUM(T.FJ) AS FJ
	 , SUM(T.F)  AS F
FROM(
	SELECT ID_ALUNO
		 , COUNT(1) AS P
		 , 0        AS FJ
		 , 0        AS F	 
	  FROM frequencia_aluno
	 WHERE frequencia = 'P'
	 GROUP BY ID_ALUNO
	 UNION ALL
	SELECT ID_ALUNO
		 , 0        AS P
		 , COUNT(1) AS FJ
		 , 0        AS F	 
	  FROM frequencia_aluno
	 WHERE frequencia = 'FJ'
	 GROUP BY ID_ALUNO
	 UNION ALL
	SELECT ID_ALUNO
		 , 0        AS P
		 , 0        AS FJ
		 , COUNT(1) AS F	 
	  FROM frequencia_aluno
	 WHERE frequencia = 'F'
	 GROUP BY ID_ALUNO
) AS T
GROUP BY T.ID_ALUNO


Grande abs
GOSTEI 1

Mais Respostas

Myller Meireles

Myller Meireles

21/07/2018

Luis Fernando,

Muito obrigado por responder!

Sua sugestão deu muito certo! Porém, preciso fazer uma consulta em outras 3 tabelas e minha dúvida está onde devo inserir o trecho abaixo do código, dentro do código que você me passou?

from alunos a, frequencia_aluno f, montar_turma m, curso c


Um abraço!
GOSTEI 0
Myller Meireles

Myller Meireles

21/07/2018

Opa... me desculpe, o código foi incompleto... o trecho completo é o que segue abaixo:

FROM frequencia f, montar_turma t, alunos a, curso c
WHERE f.turma = 39 and f.id_aluno = m.freq_id_aluno and a.alu_id = m.freq_id_aluno and c.curso_id = 326

GOSTEI 0
Luiz Santos

Luiz Santos

21/07/2018

Oi Myller.
Depende.
Se vc não precisar de mais campos, faz fora daquela query grandona.
Se tiver que trazer, aí vc faz dentro.
Mas se fizer dentro, tem que fazer nas 3 de dentro.

Grande abs
GOSTEI 0
Myller Meireles

Myller Meireles

21/07/2018

Grande Luiz Fernando,

Amigo, com sua ajuda consegui fazer a query rodar parcialmente do jeito que preciso. Ela ficou assim:

SELECT T.ID_ALUNO
     , SUM(T.P)  AS P
     , SUM(T.FJ) AS FJ
     , SUM(T.F)  AS F
FROM(
    SELECT ID_ALUNO
         , COUNT(1) AS P
         , 0        AS FJ
         , 0        AS F     
      FROM frequencia_aluno fa, montar_turma mt, alunos a, curso c
     WHERE fa.freq = 'P' and fa.turma = turma and fa.id_aluno = mt.freq_id_aluno and a.alu_id = mt.freq_id_aluno and c.curso_id = curso and mt.freq_id_turma = turma
     GROUP BY a.alu_id
     UNION ALL
    SELECT ID_ALUNO
         , 0        AS P
         , COUNT(1) AS FJ
         , 0        AS F     
      FROM frequencia_aluno fa, montar_turma mt, alunos a, curso c
     WHERE fa.freq = 'P' and fa.turma = turma and fa.id_aluno = mt.freq_id_aluno and a.alu_id = mt.freq_id_aluno and c.curso_id = curso and mt.freq_id_turma = turma
     GROUP BY a.alu_id
     UNION ALL
    SELECT ID_ALUNO
         , 0        AS P
         , 0        AS FJ
         , COUNT(1) AS F     
      FROM frequencia_aluno fa, montar_turma mt, alunos a, curso c
     WHERE fa.freq = 'P' and fa.turma = turma and fa.id_aluno = mt.freq_id_aluno and a.alu_id = mt.freq_id_aluno and c.curso_id = curso and mt.freq_id_turma = turma
     GROUP BY a.alu_id
) AS T
GROUP BY T.ID_ALUNO


Em localhost, se eu tirar os parâmetros URL "turma" e "curso" e substituí-los por números respectivos a turma e curso, ela roda perfeitamente e me traz o resultado esperado, mas quando eu coloco os parâmetros URL ($_GET['turma'] e $_GET['curso']), no ambiente de produção para teste com o navegador , dá o erro abaixo:

MySQL Error#: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AS T GROUP BY T.ID_ALUNO' at line 2


Aí a tristeza fica aqui do meu lado me olhando...!!! rsrsrsrs

O que tá errado?!
GOSTEI 0
POSTAR