Array
(
)

Filtros no SQL

Susi
   - 09 abr 2006

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


Edilcimar
   - 09 abr 2006

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


Susi
   - 09 abr 2006

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


Citação:
Se entendi direito seria
Select * from tabela where QTDPAG >= 3



Motta
   - 09 abr 2006

#Código


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


Susi
   - 09 abr 2006

Olá Mota,

Você colocou:

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

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


Edilcimar
   - 09 abr 2006

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


Susi
   - 09 abr 2006

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


Motta
   - 09 abr 2006

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


Susi
   - 10 abr 2006

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


Motta
   - 10 abr 2006

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


Susi
   - 10 abr 2006

Motta,

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


Citação:
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


Martins
   - 10 abr 2006


Citação:

AUTINC,CODASS,NUMEMI,QTDPAG
1..........0010........01............ 1
2..........0015........05............ 2
3..........0010........02............ 5
4..........0010........03............ 3
5..........0015........06............ 7
6..........0010........04............ 1



daqui vc quer q seja retornado apenas o registro


Citação:

5..........0015........06............ 7


pq é numemi é o maior (7), e a quantidade paga é maior q 3, já

Citação:

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.

Citação:

4..........0010........03............ 3
5..........0015........06............ 7


usando assim como teste apenas...
#Código


select codass, max(numemi) as emissao from testes2 where qtdpag >= 3 and testes2.numemi > X group by codass


o resultado seria

Citação:

5..........0015........06............ 7


Espero ter entendido o q vc deseja.


Susi
   - 10 abr 2006

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:

select codass, max(numemi) as emissao from testes2 where qtdpag >= 3 and testes2.numemi > X group by codass

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


Motta
   - 10 abr 2006

Vamos ver se me caiu a ficha ...

1) Monte uma view com o máximo de cada cliente

#Código


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

#Código

SELECT * FROM MAXIMUS
WHERE QTDPAG > 3


???????


Martins
   - 10 abr 2006

Não testei a solução do colega Motta pq não tenho firebird aqui, quanto ao X 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.

#Código


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

#Código

select * from spmax(3, (select max(numemi) from testes2));


Boa sorte susi


Susi
   - 10 abr 2006

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


Martins
   - 10 abr 2006


Citação:
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


Como vc usou a SP? Quais componentes vc usou? Teste-a pelo IbExpert se tiver.

O código da Sp está normal, pedi para um colega rodar a Sp para mim e está normal.

Esse código cria a Stored Procedure, teste no IbConsole, IbExpert, EMS, etc...

#Código


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


Rodando-a por uma das ferramentas acima, o código seria o já citado anteriormente.

#Código

select * from spmax(3, (select max(numemi) from testes2))


Só q não sei qual componente vc usou para executar a SP e lembre-se q vc tem q informar os paramentros.

select * from spmax(Param1, Param2)


Susi
   - 10 abr 2006

Oi, Martins,

Estou usando IBExpert...

Passei os parâmetros, sim...

Mas acho que o problema está aqui:

select * from spmax(3, (select max(numemi) from testes2));

Usei este exemplo que vc mesmo me indicou para passar os parâmetros.
Mas observe, no segundo parâmetro:

select max(numemi) from testes2

Não está selecionando o codass. Então como ele vai saber que max(numemi) pegar, ou , de quem é o max(numemi)...
Não entendo muito bem, mas acho que nesse select ele está pegando somente o max(numemi) de toda a tabela carass e não o max(numemi) de cada associado.

Sou iniciante em SP, se puder dar uma olhada e colocar suas conclusões, agradeço,

Susana


Martins
   - 11 abr 2006


Citação:
Oi, Martins,

Estou usando IBExpert...

Passei os parâmetros, sim...

Mas acho que o problema está aqui:

select * from spmax(3, (select max(numemi) from testes2));

Usei este exemplo que vc mesmo me indicou para passar os parâmetros.
Mas observe, no segundo parâmetro:

select max(numemi) from testes2

Não está selecionando o codass. Então como ele vai saber que max(numemi) pegar, ou , de quem é o max(numemi)...
Não entendo muito bem, mas acho que nesse select ele está pegando somente o max(numemi) de toda a tabela carass e não o max(numemi) de cada associado.

Sou iniciante em SP, se puder dar uma olhada e colocar suas conclusões, agradeço,

Susana


Realmente, sua observação está coerente, é q não tenho como testar esses códigos aqui, pelo menos a solução do colega Motta funcionou perfeitamente, vou ver se através dela podemos chegar a uma SP 100¬ funcional.


Motta
   - 11 abr 2006

A view não é necessária, uma query poderia resolver, mas a view deve solucionar outros problemas envolvendos o último reg. por cliente, sendo reutililizavel vale a pena criar o objeto.


Susi
   - 11 abr 2006

Olá, Martins e Motta,

Martins, obrigada pelo empenho, mas não é necessário ocupar-se com a minha dúvida, visto que o problema foi resolvido e nós temos tanta coisa mais para desenvolver (vida de programador não é facil!!!). Agradeço de coração, talvez em outra oportunidade vc me explique mais um pouco sobre SP.

Motta, é isso mesmo uma query resolve, mas como a minha seleção envolve mais dados e tabelas, a view serviu muito bem... Brigadão...

Um abraço e até mais...

Susana