Fórum Consulta SQL entre tabelas #481379

04/06/2014

0

Boa tarde a todos!

Estou com problema em uma consulta SQL que tenho que fazer de um sistema. Esta consulta seria feita entre 4 tabelas.
Tabela 1 = Alunos
Tabela 2 = Módulos
Tabela 3 = Módulos_Comprados
Tabela 4 = Notas

A questão é a seguinte: Tenho que através de uma consulta trazer em um grid o nome do aluno, o nome do módulo, a nota e a situação (aprovado ou reprovado).
A tabela Alunos esta ligada a tabela módulos comprados e notas. A tabela Módulos está ligada a tabela Módulos_Comprados e Módulos_Comprados está ligada a tabela Notas.

Tentei este script e funcionou no primeiro teste, porém quando cadastrei mais um módulo com suas notas para um aluno, o resultado duplicou, trazendo o nome do módulo com as duas notas e não apenas uma só.

SELECT NOTAS.CODIGO, NOTAS.NOTA, NOTAS.SITUACAO, ALUNOS.NOME, MODULOS.NOME
FROM NOTAS
INNER JOIN ALUNOS ON (NOTAS.COD_ALUNO = ALUNOS.CODIGO)
INNER JOIN MODULOS_COMPRADOS ON (NOTAS.COD_ALUNO = MODULOS_COMPRADOS.COD_ALUNO)
INNER JOIN MODULOS ON (MODULOS_COMPRADOS.COD_MODULOS = MODULOS.CODIGO)
WHERE NOTAS.COD_ALUNO = '1'
ORDER BY MODULOS.CODIGO


Aguem poderia me dar uma luz?
Desde já agradeço a todos.
Bruno Figueiredo

Bruno Figueiredo

Responder

Post mais votado

05/06/2014

Tenta isso:

SELECT N.ID_NOTA, N.NOTA, N.SITUACAO, A.NOME, M.MODULO
FROM NOTAS N
INNER JOIN ALUNOS A
ON (N.ID_ALUNO = A.ID_ALUNO)
INNER JOIN MODULOS_COMPRADOS MC
ON (A.ID_ALUNO = MC.ID_ALUNO)
INNER JOIN MODULOS M
ON (MC.ID_MODULO = M.ID_MODULO AND N.ID_MODULO = M.ID_MODULO)


[img]http://arquivo.devmedia.com.br/forum/imagem/264793-20140605-123709.png[/img]

Rafael Souza

Rafael Souza
Responder

Gostei + 1

Mais Posts

04/06/2014

Jefferson Santos

Tente utilizar SUM(NOTAS.NOTA), e no NOTAS.SITUACAO utilize a clausula Case.
Só o SUM(NOTAS.NOTA) vai trazer o somatorio total das notas do aluno.
Responder

Gostei + 0

04/06/2014

Jefferson Santos

Melhor, se necessario utilize uma função de agregação. Pois não sei se sua consulta deve ter somente a soma total.
Responder

Gostei + 0

04/06/2014

Bruno Figueiredo

Jefferson muito obrigado por sua resposta.
Mas a minha consulta tem que trazer apenas as notas mesmo de cada módulo que o aluno está matriculado.
Para ilustrar, vou postar o resultado deste meu código.

[img]http://arquivo.devmedia.com.br/forum/imagem/373107-20140604-165837.png[/img]

O que teria que acontecer era trazer apenas dois registros:
Introdução a informática com a nota 10 e windows 7 com a nota 0
porém este código repete... ele pega cada módulo e mostra cada uma das notas nele mesmo e não só a nota referente.
Responder

Gostei + 0

04/06/2014

Cauê Nishijima

Não sei se entendi corretamente, mas já tentou trocar INNER JOIN por LEFT JOIN?
Responder

Gostei + 0

05/06/2014

Bruno Figueiredo

Cauê, tentei também mas sem sucesso.

Improvisei temporariamente com o código abaixo, me traz os dados corretamente, mas exclui a exibição do nome do aluno, com esse código trago apenas o nome do módulo, a nota e a situação do aluno logado.

SELECT MODULOS.NOME, NOTAS.NOTA, NOTAS.SITUACAO
FROM NOTAS
INNER JOIN MODULOS ON (NOTAS.COD_MODULOS_COMPRADOS = MODULOS.CODIGO)
WHERE NOTAS.COD_ALUNO = '1'
ORDER BY MODULOS.NOME
Responder

Gostei + 0

05/06/2014

Cauê Nishijima

Vou montar a base aqui pra verificar, a tabela NOTAS tem a coluna COD_MODULO correto?
Responder

Gostei + 0

05/06/2014

Cauê Nishijima

Se possuir acredito que seja só fazer:

SELECT NOTAS.CODIGO, NOTAS.NOTA, NOTAS.SITUACAO, ALUNOS.NOME, MODULOS.NOME
FROM NOTAS
INNER JOIN ALUNOS ON (ALUNOS.CODIGO = NOTAS.COD_ALUNO)
INNER JOIN MODULOS ON (MODULOS.CODIGO = NOTAS.COD_MODULO)
WHERE NOTAS.COD_ALUNO = '1'
ORDER BY MODULOS.CODIGO
Responder

Gostei + 0

05/06/2014

Rafael Souza

Depois basta colocar na cláusula where a condição id_aluno = 1 blz..
Responder

Gostei + 0

05/06/2014

Bruno Figueiredo

Rafael, seu código está perfeito!
100% com o que eu precisava.

Muito obrigado e parabéns!
Responder

Gostei + 0

05/06/2014

Rafael Souza

Disponha, estamos ai!
Responder

Gostei + 0

05/06/2014

Bruno Figueiredo

Para quem tiver a mesma dúvida, segue abaixo o código que funcionou fino, com a ajuda de todos.
Dei uma incrementada referente a exibição.

SELECT NOTAS.CODIGO, NOTAS.NOTA, ALUNOS.NOME, MODULOS.NOME,
CASE NOTAS.SITUACAO
WHEN 'AP' THEN 'APROVADO'
WHEN 'RP' THEN 'REPROVADO'
WHEN 'RC' THEN 'RECUPERAÇÃO'
END AS SITUACAO_ALUNO
FROM NOTAS
INNER JOIN ALUNOS ON (NOTAS.COD_ALUNO = ALUNOS.CODIGO)
INNER JOIN MODULOS_COMPRADOS ON (ALUNOS.CODIGO = MODULOS_COMPRADOS.COD_ALUNO)
INNER JOIN MODULOS ON (MODULOS_COMPRADOS.COD_MODULOS = MODULOS.CODIGO AND NOTAS.COD_MODULOS_COMPRADOS = MODULOS.CODIGO)
WHERE NOTAS.COD_ALUNO=:PALUNO


Problema solucionado!
Muito obrigado a todos!
Abraço
Responder

Gostei + 0

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

Aceitar