Fórum Ajuda com Select com max #460425

07/11/2013

0

Bom dia Caros colegas estou tentando fazer um Select que inicialmente pensei que seria fácil mas já esta de dando muitro trabalho
veja o cenário

Tenho uma tabela de Produto, Nota e Itens
preciso retornar todos os produtos com data e quantidade da ultima compra .
na tabela itens tenho a quantidade de produtos comprado
na tabela nota a data da compra e em produtos o código descrição...

o Relatório teria que ficar desta forma:

Data compra Código produto quantidade comprada

20/10/2013 01 - PRODUTO A - 10
15/10/2013 02 - PRODUTO B - 05
10/10/2013 03 - PRODUTO C - 09
08/10/2013 05- PRODUTO D - 11
...
com este select eu consigo trazer a data da ultima compra mas fica faltando a quantidade
se colocar quantidade o select perde o efeito

select max(nf.dataemissao)data_Ultimacompra, it.codproduto, pd.descprod from produto PD
inner join itennfc it on it.codproduto = pd.codproduto
inner join nf_entrada nf on nf.cd_saida = it.cd_saida
group by it.codproduto, pd.descprod


se alguem puder ajudar agradeço

:
Hugo Silva

Hugo Silva

Responder

Posts

07/11/2013

Alex Lekao

Oi Boa tarde!!!

Vc colocou por exemplo it.qtdade e nao deu certo?

vc possivelmente tera que colocar o it.qtdade tbm no group by.

agora so mais uma duvida, se vc quiser que naquela data se aconteceu mais de uma venda do produto, ele some todas as quantidades do dia, experimente colocar sum(it.qtdade) por exemplo, e veja se funciona.

Espero ter ajudado.

Abraco.

Alex - Lekao
Responder

Gostei + 0

07/11/2013

Hugo Silva

Então o problema é este se colocar a quantidade no Group by os produtos vão ficar duplicados pois a quantidade é diferente em cada venda
é quero somente a ultima compra de cada produto

Tentei colocar sum(it.quantidade) mas neste caso esta somando todas as compras...

agradeço pela dica mas não deu

Responder

Gostei + 0

07/11/2013

Thiago Irrazabal

Boa tarde, tente trocar o teu select max por isso:

SELECT FIRST(1)


Ficando assim:

select FIRST(1) nf.dataemissao as data_Ultimacompra, it.codproduto, pd.descprod from produto PD
inner join itennfc it on it.codproduto = pd.codproduto
inner join nf_entrada nf on nf.cd_saida = it.cd_saida
group by it.codproduto, pd.descprod




Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

07/11/2013

Hugo Silva

Thiago Irrazabal,

Se Trocar o select Max por First 1 ele vai trazer somente a ultima compra é o que preciso é a ultima compra de cada produto
desta forma:
Data compra Código produto quantidade comprada

20/10/2013 01 - PRODUTO A - 10
15/10/2013 02 - PRODUTO B - 05
10/10/2013 03 - PRODUTO C - 09
08/10/2013 05- PRODUTO D - 11
...

mas obrigado pela ajuda !

Responder

Gostei + 0

07/11/2013

Alex Lekao

nao sei se funcionara no firebird, mas tenta colocar no first(-1)...

nao sei se funciona, so passou pela minha cabeca. rsrsr
Responder

Gostei + 0

07/11/2013

Hugo Silva

o First só aceita valores >= 0 e neste caso não retorna nada !
Responder

Gostei + 0

07/11/2013

Hugo Silva

com estes dois select eu tenho as informação que preciso
só não consegui juntar eles em um só

select max(nf.dataemissao)data_Ultimacompra,it.codproduto,pd.descprod,pd.estoque ,pd.estmin,est.estoque est_mult, cl.nome forn_padrao
from produto PD
inner join itennfc it on it.codproduto = pd.codproduto
inner join nf_entrada nf on nf.cd_saida = it.cd_saida
inner join estoque est on est.codproduto = pd.codproduto and est.codempresa =:codempresa
inner join cliente frn on frn.codcliente = nf.codfornecedor
left join cliente cl on cl.codcliente = pd.codfornecedor
group by it.codproduto, pd.descprod, pd.estoque,pd.estmin,est.estoque, cl.nome


select first 1 nf.cd_saida, it.quantidade, forn.nome
from itennfc it
inner join nf_entrada nf on nf.cd_saida = it.cd_saida
inner join cliente forn on forn.codcliente = nf.codfornecedor
where nf.dataemissao =:dataemissao and it.codproduto=:codproduto and nf.codempresa=:codempresa
order by nf.cd_saida desc

se alguem solber alguma dica agradeço
Responder

Gostei + 0

07/11/2013

Alex Lekao

ja tentou usar o UNION?

dependendo vc podera usar um subselect.

a informacao que estao faltando vc coloca como subselect e no where do subselect relaciona com um campo unico que seja igual nos dois.

teste e veja se funciona.
Responder

Gostei + 0

07/11/2013

Hugo Silva

Tentei usando sub select mas não consegui,

pelo jeito vou ter que usar os select separados mesmo
...

mas obrigado pela ajuda !
Responder

Gostei + 0

07/11/2013

Alex Lekao

vou tentar montar alguma coisa aqui com o subselect e postar para ver se conseguimos algo melhor..

o ruim eh que nao mexe com Firebird faz um tempo e entao nao tenho certeza como talvez funciona algumas coisas, no SQL Server normalmente faco os subselects e funcionam balinha.

ja ja eu posto algo aqui para vc testar.
Responder

Gostei + 0

07/11/2013

Alex Lekao

esperimenta assim

select
   max(nf.dataemissao)data_Ultimacompra,
   it.codproduto,
   pd.descprod,
   pd.estoque ,
   pd.estmin,
   est.estoque est_mult,
   (select
       sum(it.quantidade)
    from itennfc it
    where it.codproduto = pd.codproduto
       and it.numnf = nf.numnf
    ) qtd_cmp,
   cl.nome forn_padrao
from produto PD
inner join itennfc it on it.codproduto = pd.codproduto
inner join nf_entrada nf on nf.cd_saida = it.cd_saida
inner join estoque est on est.codproduto = pd.codproduto and est.codempresa =:codempresa
inner join cliente frn on frn.codcliente = nf.codfornecedor
left join cliente cl on cl.codcliente = pd.codfornecedor
group by it.codproduto, pd.descprod, pd.estoque,pd.estmin,est.estoque, cl.nome


como nao tenho estrutura nem base aqui fica mais dificil para eu pazer.

esse numnf eh especulacao pq nao sei qual eh o campo que poderia utilizar.
Responder

Gostei + 0

08/11/2013

Hugo Silva

Alex - Lekao,


Já tinha tentando algo do tipo, mas o FireBird acusa este erro
:
Invalid expression in the select list (not contained in either an
aggregate function or the GROUP BY clause)

Então achei que o erro estaria em meu código ,

Mas vendo o que me passou de exemplo vejo que problema esta no FireBird

no seu caso faltou colocar ao subquery no group by
e eu fiz isto para ver se roda e até o momento nada !


Obrigado pela ajuda !

Responder

Gostei + 0

08/11/2013

Alex Lekao

oi...

imaginei que talvez faltasse alguma coisa...

para eu fazer testes mais consistentes com relacao ao seu codigo para tentar te ajudar fica mais dificil sem as estruturas e algum conteudo mas tudo bem.

vc colocou o group by no codigo dentro do subselect e no where colocou alguma relacao com o select principla, certo?
Responder

Gostei + 0

08/11/2013

Hugo Silva

isto

olha o código como esta :

select
   max(nf.dataemissao)data_Ultimacompra,
   it.codproduto,
   pd.descprod,
   pd.estoque ,
   pd.estmin,
   est.estoque est_mult,
   (select
       sum(it.quantidade)
    from itennfc it
    where it.codproduto = pd.codproduto
       and it.cd_saida = nf.cd_saida
    ) as qtd_cmp,
   cl.nome forn_padrao
from produto PD
inner join itennfc it on it.codproduto = pd.codproduto
inner join nf_entrada nf on nf.cd_saida = it.cd_saida
inner join estoque est on est.codproduto = pd.codproduto and est.codempresa =:codempresa
inner join cliente frn on frn.codcliente = nf.codfornecedor
left join cliente cl on cl.codcliente = pd.codfornecedor
where nf.dataemissao between :datain and :datafin
group by it.codproduto, pd.descprod, pd.estoque,pd.estmin,est.estoque, cl.nome,
   (select sum(it.quantidade)  from itennfc it  where it.codproduto = pd.codproduto and it.cd_saida = nf.cd_saida )


Não consegui encontrar o erro
Responder

Gostei + 0

08/11/2013

Thiago Irrazabal

Veja se funciona assim:

select
   max(nf.dataemissao)data_Ultimacompra,
   it.codproduto,
   pd.descprod,
   pd.estoque ,
   pd.estmin,
   est.estoque est_mult,
   (select
       sum(it.quantidade)
    from itennfc it
    where it.codproduto = pd.codproduto
       and it.cd_saida = nf.cd_saida
    ) as qtd_cmp,
   cl.nome forn_padrao
from produto PD
inner join itennfc it on it.codproduto = pd.codproduto
inner join nf_entrada nf on nf.cd_saida = it.cd_saida
inner join estoque est on est.codproduto = pd.codproduto and est.codempresa =:codempresa
inner join cliente frn on frn.codcliente = nf.codfornecedor
left join cliente cl on cl.codcliente = pd.codfornecedor
where nf.dataemissao between :datain and :datafin
group by it.codproduto, pd.descprod, pd.estoque,pd.estmin,est.estoque, cl.nome,
   qtd_cmp





Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar