Filtros no SQL
09/04/2006
0
Tenho um tabela TBCARASS com 4 campos
(AUTINC,CODASS,NUMEMI,QTDPAG), onde
CODASS=Código do Associado
NUMEMI= Número de emissão do carnê
QTDPAG= Quantidade de parcelas pagas
Supondo que estes são os dados gravados
nela:
1 0010 01 1
2 0015 05 2
3 0010 02 5
4 0010 03 3
5 0015 06 7
Como extrair num SELECT ou até mesmo
numa STORED PROCEDURE o último número
de Emissões (NUMEMI) de cada Sócio (CODASS),
porém cuja QTDPAG seja maior, por exemplo a 3.
Neste exemplo acima, deveria apresentar somente como
resultado o CODASS = 0015 pois a QTDPAG da última emissão do
CODASS = 0010 não é maior que 3...
Espero uma sugestão...
Susana
Susi
Posts
09/04/2006
Edilcimar
Select * from tabela where QTDPAG >= 3
09/04/2006
Susi
Veja, eu preciso que além da QTDPAG>=3, que seja selecionada somente o último NUMEMI daquele CODASS.
Explicando melhor: eu tenho uma tabela de Associados e outra Tabela de Carnes Associados, onde tenho o NUMEMI(número de emissão do carne).
Um mesmo Associado pode ter diversos NUMEMI diferentes. Eu preciso pegar o último(maior) NUMEMI de cada associado e daí sim, verificar se QTDPAG>=3.
Tens uma idéia de como fazer isso?
Fico no aguardo
Susana
09/04/2006
Motta
tabela TBCARASS com 4 campos (AUTINC,CODASS,NUMEMI,QTDPAG), onde select CODASS,max(NUMEMI) NUMEMI from TBCARASS where QTDPAG>=3 group by CODASS
Creio que é isto ...
09/04/2006
Susi
Você colocou:
select CODASS,max(NUMEMI) NUMEMI
from TBCARASS
where QTDPAG>=3
group by CODASS
[/code]
Creio que é isto ...
Não é isso ainda que preciso. No seu código, acontece o seguinte, ele primeiro filtra os associados que tem QTDPAG>=3, e só depois pega o max(NUMEMI), o que não resolve, visto que as vezes acontece de o máximo carne emitido ainda não ter 3 parcelas pagas....
Eu preciso PRIMEIRO pegar o max(NUMEMI) de cada associado e DESTES filtrar somente os que tenham QTDPAG>=3.
Não sei se consegui me fazer entender, mas é isso...
Continuo testando e aguardando sugestões...
Susana
09/04/2006
Susi
Eu acho que vc não entendeu muito bem o meu problema... Tentei explicar melhor num post anterior para o Motta, se quiser dar uma olhada...
Como vou colocar : where qtdpag = max(numemi) se qtdpag é uma coisa e numemi outra?
QQuer solução estou por aqui...
Susana
09/04/2006
Motta
10/04/2006
Susi
Desde já agradeço sua atenção à minha dúvida, mas veja os dados a seguir:
1 0010 01 1
2 0015 05 2
3 0010 02 5
4 0010 03 3
5 0015 06 7
6 0010 04 1
Acrescentei mais um dado...
Bom, no associado 0010 o maior NUMEMI é o 04, só que eu a QTDPAG é menor que 3, então esse associado não deve aparecer na minha lista...
Só que utilizando sua query, ele primeiro busca QTDPAG>=3, ou seja, aparece listado o associado 0010, com o >NUMEMI 03, quando na verdade
não seria esse meu propósito...
Talvez vc achou que deu certo, porque eu não tinha colocado um dado onde no maior NUMEMI, a QTDPAG não atendesse o filtro...
Espero que tenha entendido...
Eu já estou 3 dias , tentando resolver , e tá difícil...
Um abraço
Susana
10/04/2006
Susi
Veja bem, eu preciso que analise o ultimo(maior) NUMEMI que no CODASS 0010 é o 04.
Nesse registro que vc pegou, o NUMEMI é o 03 ou seja não é o último NUMEMI desse associado...
Deu pra entender?
Susana
10/04/2006
Martins
daqui vc quer q seja retornado apenas o registro
pq é numemi é o maior (7), e a quantidade paga é maior q 3, já
o maior numemi é 4 mas a qtdpag é menor do q 3.
nesse caso acho q vc terá q usar SP para obter o resultado. pq com um simples select não sei se resolveria.
com o SQL do nosso colega Motta, o resultado seria.
usando assim como teste apenas...
select codass, max(numemi) as emissao from testes2 where qtdpag >= 3 and testes2.numemi > X group by codass
o resultado seria
Espero ter entendido o q vc deseja.
10/04/2006
Susi
Seja bem vindo ao meu ´problema´...
Como você pode verificar, o Sql do Motta, não atende o que preciso...
Já no seu Sql, o resultado está correto, mas não entendi o que seria o ´X´ em:
[color=blue:27ee07e1da]select codass, max(numemi) as emissao from testes2 where qtdpag >= 3 and testes2.numemi > X group by codass[/color:27ee07e1da]
Concordo com vc que o caminho deve ser criar SP, mas ainda não consegui...
Tem alguma idéia? Ou algum exemplo em que eu possa me basear?
Desde já agradeço
Susana
10/04/2006
Motta
1) Monte uma view com o máximo de cada cliente
CREATE VIEW MAXIMOS AS select AUTINC,CODASS,NUMEMI,QTDPAG from TBCARASS T1 where T1.NUMEMI = (SELECT MAX(T2.NUMEMI) FROM TBCARASS T2 WHERE T2.CODCLI = T1.CODCLI)
2) use a view fazendo o teste nela
SELECT * FROM MAXIMUS WHERE QTDPAG > 3
???????
10/04/2006
Martins
Quanto ao uma SP q possa fazer o q vc deseja, imagino q essa deva servir como base para vc montar a sua.
CREATE PROCEDURE SPMAX ( PAGAS INTEGER, EMISSAO INTEGER) RETURNS ( CODASS INTEGER, NUMEMI INTEGER) AS begin /* Procedure Text */ for Select codass, max(numemi) From testes2 where qtdpag >= :pagas and numemi >= :emissao group by codass into :codass, :numemi do suspend; end
pode chamar a [b:b6b076dae4]SP[/b:b6b076dae4] assim.
select * from spmax(3, (select max(numemi) from testes2));
Boa sorte [b:b6b076dae4]susi[/b:b6b076dae4]
10/04/2006
Susi
Ufa!!! A View do colega Motta, funcionou perfeitamente... Aprendi um bocado, visto que nunca tinha usado esse recursos de views...
Quanto a SP, ela não retorna nada... Será que tem algum parametro errado na nossa montagem???
Martins, se tiveres uma idéia do que poderia estar errado, poderias me dar um toque, visto que também tenho interesse de aprender a usar SP.
No mais, obrigado a todos
Um abraço :D :D
Susana