Ajuda com Select com max

Firebird

07/11/2013

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

Curtidas 0

Respostas

Alex Lekao

Alex Lekao

07/11/2013

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
GOSTEI 0
Hugo Silva

Hugo Silva

07/11/2013

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

GOSTEI 0
Thiago Irrazabal

Thiago Irrazabal

07/11/2013

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.
GOSTEI 0
Hugo Silva

Hugo Silva

07/11/2013

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 !

GOSTEI 0
Alex Lekao

Alex Lekao

07/11/2013

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

nao sei se funciona, so passou pela minha cabeca. rsrsr
GOSTEI 0
Hugo Silva

Hugo Silva

07/11/2013

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

Hugo Silva

07/11/2013

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
GOSTEI 0
Alex Lekao

Alex Lekao

07/11/2013

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.
GOSTEI 0
Hugo Silva

Hugo Silva

07/11/2013

Tentei usando sub select mas não consegui,

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

mas obrigado pela ajuda !
GOSTEI 0
Alex Lekao

Alex Lekao

07/11/2013

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.
GOSTEI 0
Alex Lekao

Alex Lekao

07/11/2013

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.
GOSTEI 0
Hugo Silva

Hugo Silva

07/11/2013

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 !

GOSTEI 0
Alex Lekao

Alex Lekao

07/11/2013

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?
GOSTEI 0
Hugo Silva

Hugo Silva

07/11/2013

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
GOSTEI 0
Thiago Irrazabal

Thiago Irrazabal

07/11/2013

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.
GOSTEI 0
Alex Lekao

Alex Lekao

07/11/2013

Oi Hugo,

o que estava querendo dizer eh que talvez tivesse de ter um group by dentro do subselect.

testa assim para ver:

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
    group by it.codproduto
    ) 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


testa o que o amigo postou tambem... e testa esse... e vamos ver se da certo.

Abraco.
GOSTEI 0
Hugo Silva

Hugo Silva

07/11/2013

Rapaz ta de rosca rs

não consigo encontrar erros nesta Sql e o negócio não roda sempre da erro

já tinha testado colocando apenas o alias e depois colocando a sentença interia e nada

bom por hora eu fiz usando a mais moderna tecnologia "POG'
não consegui achar uma solução para Query

agradeço a todos pela ajuda!
GOSTEI 0
Alex Lekao

Alex Lekao

07/11/2013

Oi Hugo, bom dia!!!

Meu camarada, muito estranho isso.

precisariamos dar uma olhada passo a passo, ou seja, montar os scripts por partes no caso, para verificar se vamos conseguindo os resultados esperados, e depois tentamos unir os scripts atravez de subselects se for o caso, ou usando os joins.

mas acredito que para termos um teste melhor precisar da estrutura das tabelas e se possivel conteudo para fazer os testes.

sempre faco esse tipo de script com o SQL Server e sempre tenho o resultado que preciso, achei estranho esse nao ter funcionado, acho que o ideal sera tratar por partes mesmo.

Abraco.

Alex - Lekao
GOSTEI 0
POSTAR