Ajuda com Select com max
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
:
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
Curtidas 0
Respostas
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
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
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
é 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
07/11/2013
Boa tarde, tente trocar o teu select max por isso:
Ficando assim:
Att,
Thiago Irrazabal de Oliveira.
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
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 !
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
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
nao sei se funciona, so passou pela minha cabeca. rsrsr
GOSTEI 0
Hugo Silva
07/11/2013
o First só aceita valores >= 0 e neste caso não retorna nada !
GOSTEI 0
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
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
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.
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
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 !
pelo jeito vou ter que usar os select separados mesmo
...
mas obrigado pela ajuda !
GOSTEI 0
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.
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
07/11/2013
esperimenta assim
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.
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
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 !
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
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?
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
07/11/2013
isto
olha o código como esta :
Não consegui encontrar o erro
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
07/11/2013
Veja se funciona assim:
Att,
Thiago Irrazabal de Oliveira.
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
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:
testa o que o amigo postou tambem... e testa esse... e vamos ver se da certo.
Abraco.
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
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!
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
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
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