• Revista PROGRAMAR: Já está disponível a edição #54 da revista programar. Faz já o download aqui!

_MANEL_

Ajuda em SQL, function, trigger, Store Procedure

6 mensagens neste tópico

Boas. tou com um pequeno problema. tenho um trabalhito para fazer mas não pesco nada de SQL... se alguem pudesse ajudar agradecia muito ^^

Tendo esta BD:

asbdsk8.jpg

preciso de fazer isto: 

  • Uma Function que receba o Identificador do Aluno e Retorne a sua média
  • Uma Store Procedure que, com base no Identificador do Aluno e num Determinado Valor (Ex:
    9,5), retorne as Disciplinas superadas em função da classificação (Valor passado)
  • Um Trigger que seja disparada sempre que é colocada uma nova classificação / Actualização ou
    Eliminação.
    (Deverá actualizar a média do Aluno na Tabela Aluno e o contador de Classificações Lançadas na
    Tabela Disciplina)

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem. até agora fiz isto:

Create Function 
CalcularMedia(@Identificador int)
Returns 
float
As
Begin
Declare @avg float(8)
Select @avg=Media from Alunos Where IDAluno=@Identificador
Return @avg
End

Create Procedure DisciplinasSuperadas
@Identificador int, @valor_nota int
As
Select
	d.Descricao
From
	Classificacoes AS c INNER JOIN
	Disciplinas AS d ON c.IDDisciplina = d.IDDisciplina
Where
	c.IDClassificacao > @valor_nota
	AND c.IDAluno = @Identificador
	AND Data < GETDATE()

mas o trigger está-me a dar voltas à cabeça... não estou mesmo a conseguir fazer.

algum pro pode dar uma ajudinha?? :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi manel,

apenas um pequeno conselho evita o campo média na tabela alunos como o diabo a cruz!!!

Sabes porque? porque é assim; tu tens procedimentos de edição (tipo adicionar/modificar/eliminar registos) e de relatório (obter dados e processa-los de alguma maneira).

Logo, se tu quiseres a média desencadeias uma SP qualquer que te das notas do teu aluno, ora a média não precisas de guardar na base de dados o que precisas de guardar são as notas ok?

Já vistes porque razão há-de guardar na base de dados a média se todas as vezes que adicionas uma nova nota vais ter de alterar a média também, adicionares apenas a nova nota basta-te para em qualquer altura obteres a media.

Se não tas a ver ainda o que digo vais ver por ti depois quando fizeres bases de dados mais complicados e tiveres de voltar ao inicio de quando em vez.

Mantem isso do id em cada tabela,a tabela classificações parace ok, o resto não tou a ver assim nada para dizer mas tambem não tenho assim a estrutura duma base de dados de escola.

Investe na estrutura importante, hás-de ter store_procedures + lógicas.

Boa sorte

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora bem.. isto não é bem uma ajuda, é mais um comentário :)

O Nelson não está totalmente correcto, mas anda lá perto! :P

Não precisas realmente de guardar a média por aluno porque é algo que podes sempre calcular "on the fly" com o registo das notas.

Portanto, uma query deste género deve dar o resultado pretendido:

SELECT a.idaluno, a.nome, avg(b.classificacao)
FROM alunos a LEFT JOIN classificacoes b ON a.idaluno = b.idaluno
WHERE a.idaluno = @aluno_xpto
GROUP BY a.idaluno, a.nome;

Ora, o uso da função de calculo da média tem o seu "custo" a nível de computação por parte da base de dados.. se estivesse-mos a falar de queries a retornar milhares ou milhões de resultados, poderias então pensar em optimizar esse calculo para poderes ter tempos de resposta mais curtos.

E aí então, poderias pensar em colocar esse calculo num trigger para te manter a média por aluno já calculada. Apesar de redundante, esse campo da média (é redundante porque pode ser calculado a qualquer altura), podia então fazer sentido. Já que o tal trigger iria manter a média já calculada sempre que houvesse uma alteração/inserção/eliminação de alguma nota de um determinado aluno. E como esse trigger ia estar a lidar com poucos registos (só com os de um determinado aluno), esse calculo iria ser muito mais rápido, e daí o ganho de performance.

Espero ter-me explicado bem.

Este processe de ter campos redundantes (já calculados) é conhecido por processo de desnormalização de uma base de dados.

Podes ler mais algumas coisas sobre isto, por exemplo, aqui:

http://database-programmer.blogspot.com/2008/04/denormalization-patterns.html

Espero ter ajudado, ou pelo menos, iluminado ou despertado a curiosidade :)

Inté!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora