Dúvida com instrução SQL...
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...
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...
André Maretti
Curtidas 0
Respostas
Paulo
16/05/2008
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
GOSTEI 0
Paulo
16/05/2008
CORREÇÃO: UM F.MATRICULA TROQUE POR A.MATRICULA
GOSTEI 0
André Maretti
16/05/2008
Paulo... valeu pela força... mas ainda não deu certo...
segue a forma que eu fiz... baseado na sua dica..
Mas ele dá a seguinte mensagem de erro:
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é.
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é.
GOSTEI 0
Rjun
16/05/2008
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,
GOSTEI 0
André Maretti
16/05/2008
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:
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]
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]
GOSTEI 0
Emerson Nascimento
16/05/2008
troque JOIN por LEFT JOIN
GOSTEI 0
André Maretti
16/05/2008
OK.... beleza... funcionou certinho...
brigadão!
:D
brigadão!
:D
GOSTEI 0