Dúvida com instrução SQL...

16/05/2008

1

Pessoal... seguinte:

Tenho duas tabelas: cad_alunos e faltas

a cad_alunos é assim:
Codigo | matricula | nome_aluno | endereco | ...
1 02700T andre xxx
2 02701T joão xxx
3 02702T maria xxx
4 02703T jose xxx
5 02704T ana xxx


a faltas é assim:
codigo | matricula | data
x 02700T 01/05/2008
x 02702T 02/05/2008
x 02702T 03/05/2008
x 02704T 04/05/2008
x 02704T 05/05/2008
x 02704T 06/05/2008


Eu Preciso fazer um select onde o resultado fosse algo assim:
Codigo | matricula | nome_aluno | qtd_faltas | ...
1 02700T andre 1
2 02701T joão 0
3 02702T maria 2
4 02703T jose 0
5 02704T ana 3


Será q alguém pode me ajudar, pois tenter de algumas formas aqui... mas não saiu exatamente como o modelo acima...


Responder

Posts

16/05/2008

Paulo

ACREDITO QUE NA TABELA FALTAS EXISTA UM CAMPO PARA FALTAS, POIS NO SEU EXEMPLO NÃO EXISTE.

SELECT A.CODIGO,A.MATRICULA, A.NOME, SUM(F.FALTA) AS QTD_FALTA FROM CAD_ALUNOS A INNER JOIN FALTAS F ON(F.CODIGO = A.CODIGO AND F.MATRICULA = F.MATRICULA) WHERE A.CODIGO = AQUI CODIGO DO ALUNO



Responder

16/05/2008

Paulo

CORREÇÃO: UM F.MATRICULA TROQUE POR A.MATRICULA


Responder

16/05/2008

André Maretti

Paulo... valeu pela força... mas ainda não deu certo...

segue a forma que eu fiz... baseado na sua dica..
Query_Relatorio_Alunos.SQL.Clear;

Query_Relatorio_Alunos.SQL.Add(´SELECT A.MATRICULA, A.nome_aluno, A.TELEFONE_RESIDENCIAL, A.TELEFONE_COMERCIAL, A.CELULAR, SUM(F.data) AS QTD_FALTA FROM zeus_cad_alunos A INNER JOIN zeus_faltas F ON(F.MATRICULA = A.MATRICULA)´);

Query_Relatorio_Alunos.Open;


Mas ele dá a seguinte mensagem de erro:
SQL Error: Mixing of Group columns (MIN(), MAX(), COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause.


Tentei fazer uns Groupby aqui... mas sem sucesso...

será que alguém pode me dar mais um help.

Detalhe: eu preciso que saia uma lista com todos os alunos, mesmo aqueles que não possuem nenhuma falta, saindo para esses.. ZERO na coluna quantidade de faltas... Ou seja.. é preciso contar para cada aluno quantos registro tem na tabela Faltas com a matrícula do respectivo aluno.

Desde já agradeço...

André.


Responder

16/05/2008

Rjun

Deixe seu sql da seguinte maneira:

SELECT 
  Al.Matricula,
  Al.Nome_Aluno,
  Al.Telefone_Residencial,
  Al.Telefone_Comercial,
  Al.Celular, 
  COUNT(Fa.Data) AS Qtd_Falta
FROM 
  Cad_Alunos Al
JOIN 
  Faltas Fa ON Fa.Matricula = Al.Matricula
GROUP BY
  Al.Matricula,
  Al.Nome_Aluno,
  Al.Telefone_Residencial,
  Al.Telefone_Comercial,
  Al.Celular, 



Responder

17/05/2008

André Maretti

Então RJuan... até aqui eu até tinha conseguido chegar... o problema é que com a instrução desse jeito... só aparece no grid os clientes que possuem faltas. Aqueles que não tem Faltas não aparecem. E eu precisava que aqueles que não possui falta nenhuma cadastrada aparecesse na lista com a quantidade de faltas = 0.

Tipo assim:
Minha tabela de alunos é assim: (os tracinhos claro não existem.. é só pra dar o alinhamento... rs)
Codigo | matricula | nome_aluno | endereco | ...
---1------ 02700T----- andre--------- xxx
---2------ 02701T----- joão----------- xxx
---3------ 02702T----- maria--------- xxx
---4------ 02703T----- jose----------- xxx
---5------ 02704T----- ana------------ xxx

Minha Tabela de Faltas é assim:
codigo | matricula | data
---x------02700T----01/05/2008
---x------02702T----02/05/2008
---x------02702T----03/05/2008
---x------02704T----04/05/2008
---x------02704T----05/05/2008
---x------02704T----06/05/2008

Percebe que o aluno joão, matrícula 02701T não possui nenhumja falta. A mesma coisa acontece com o aluno josé, matrcícula 02703T.

Com o SQL assim:
SELECT 
  Al.Matricula, 
  Al.Nome_Aluno, 
  Al.Telefone_Residencial, 
  Al.Telefone_Comercial, 
  Al.Celular, 
  COUNT(Fa.Data) AS Qtd_Falta 
FROM 
  Cad_Alunos Al 
JOIN 
  Faltas Fa ON Fa.Matricula = Al.Matricula 
GROUP BY 
  Al.Matricula, 
  Al.Nome_Aluno, 
  Al.Telefone_Residencial, 
  Al.Telefone_Comercial, 
  Al.Celular


o resultado da tabela fica assim: (ocultei os campo de telefones para economizar espaço)
Codigo | matricula | nome_aluno | qtd_faltas | ...
---1------02700T-----andre-----------1
---3------02702T-----maria-----------2
---5------02704T-----ana-------------3

repare que os alunos que não possuem faltas, como é o caso do João (02701T) e do José (02703T) não aparecem no resultado.

O que eu preciso é de uma tabela assim:
Codigo | matricula | nome_aluno | qtd_faltas | ...
---1------02700T-----andre-----------1
[b:2fcc6f07dd]--2-----02701T----joão----------0 [/b:2fcc6f07dd]
---3------02702T-----maria-----------2
[b:2fcc6f07dd]--4-----02703T----jose----------0 [/b:2fcc6f07dd]
---5------02704T-----ana-------------3

Onde os alunos que não possuem nenhuma falta apareçam na tabela com a quantidade de faltas = 0.

Agradeço ai pela força... mas será que alguém ainda tem alguma de como fazer?

Abraços.[b:2fcc6f07dd][/b:2fcc6f07dd]


Responder
troque JOIN por LEFT JOIN


Responder

18/05/2008

André Maretti

OK.... beleza... funcionou certinho...

brigadão!

:D


Responder