09/04/2006

Filtros no SQL

D7+IBO+Firebird 1.5

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

Respostas

09/04/2006

Edilcimar

Se entendi direito seria
Select * from tabela where QTDPAG >= 3


Responder Citar

09/04/2006

Susi

Olá Edilcimar,

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

Se entendi direito seria Select * from tabela where QTDPAG >= 3



Responder Citar

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 ...


Responder Citar

09/04/2006

Susi

Olá Mota,

Você colocou:

select CODASS,max(NUMEMI) NUMEMI
from TBCARASS
where QTDPAG>=3
group by CODASS
[/code]

Creio que é isto ...[/quote]

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


Responder Citar

09/04/2006

Edilcimar

where qtdpag = max(numemi) não funciona?


Responder Citar

09/04/2006

Susi

Olá Edilcimar,

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


Responder Citar

09/04/2006

Motta

susi , acho que funciona minha qry pois que não tiver 3 pagas não aparece na lista.


Responder Citar

10/04/2006

Susi

Olá Motta,

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


Responder Citar

10/04/2006

Motta

minha query pegaria 4 0010 03 3
para o cliente 10, nao ?


Responder Citar

10/04/2006

Susi

Motta,

Veja bem, eu preciso que analise o ultimo(maior) NUMEMI que no CODASS 0010 é o 04.

minha query pegaria 4 0010 03 3 para o cliente 10, nao ?


Nesse registro que vc pegou, o NUMEMI é o 03 ou seja não é o último NUMEMI desse associado...

Deu pra entender?

Susana


Responder Citar

10/04/2006

Martins

[b:cf5b696ccf]AUTINC,CODASS,NUMEMI,QTDPAG[/b:cf5b696ccf] 1..........0010........01............ 1 2..........0015........05............ 2 3..........0010........02............ 5 4..........0010........03............ 3 [b:cf5b696ccf][color=red:cf5b696ccf]5..........0015........06............ 7 [/color:cf5b696ccf][/b:cf5b696ccf] 6..........0010........04............ 1


daqui vc quer q seja retornado apenas o registro

[color=red:cf5b696ccf]5..........0015........06............ 7 [/color:cf5b696ccf]


pq é numemi é o maior (7), e a quantidade paga é maior q 3, já
6..........0010........04............ 1


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.
[color=green:cf5b696ccf]4..........0010........03............ 3 [/color:cf5b696ccf] [b:cf5b696ccf][color=red:cf5b696ccf]5..........0015........06............ 7 [/color:cf5b696ccf][/b:cf5b696ccf]


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
[color=red:cf5b696ccf]5..........0015........06............ 7 [/color:cf5b696ccf]


Espero ter entendido o q vc deseja.


Responder Citar

10/04/2006

Susi

Olá, Martins,

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


Responder Citar

10/04/2006

Motta

Vamos ver se me caiu a ficha ...

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


???????


Responder Citar

10/04/2006

Martins

Não testei a solução do colega [b:b6b076dae4]Motta[/b:b6b076dae4] pq não tenho firebird aqui, quanto ao [b:b6b076dae4]X[/b:b6b076dae4] seria ele um parametro, uma informação externa q eu usei apenas para exemplificar um teste.

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]


Responder Citar

10/04/2006

Susi

Amigos Motta e Martins,

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


Responder Citar