Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Giuliano Santos

Ultima compra do cliente com Firebird

Recommended Posts

Estou tentando listar todos os meus clientes indiferente se ele comprou ou não, mais se ele tem alguma compra mostrar a data e o valor somente da ultima compra.

 

Fiz um código para isso mais não esta funcionando:

SELECT c.cod_cliente, c.nome, filtro.data , filtro.vl_produto
from clientes c
LEFT JOIN (
    WITH L2 As (
    SELECT s.cliente as cli, MAX(n.data) As UltimaData
    FROM produtos_eventos pe
    inner join saidas s on s.saida = pe.cod_operacao
    inner join nf n on n.cod_operacao = s.saida and n.tipo_operacao = s.tipo_operacao_s and n.cancelada = 'F'
    inner join cfop cf on cf.cfop = pe.cfop
    left join funcionarios fun on fun.funcionario = s.funcionario
    where s.data BETWEEN '01/01/16' AND '03/29/16'
        and pe.quantidade <> 0
        and cf.nat_operacao in('5.101','6.101','5.102','5.403','6.102','6.107','6.108','6.403','5.551','6.551','5.933','6.933','7.551','6.108','6.109','6.110','7.101','7.102')
    GROUP BY s.cliente)

    SELECT s.cliente, c.nome, n.data, sum ((pe.total_liquido + pe.v_ipi + pe.v_icmss) - pe.desc_suframa) as vl_produto
    FROM produtos_eventos pe
    inner join saidas s on s.saida = pe.cod_operacao
    inner join nf n on n.cod_operacao = s.saida and n.tipo_operacao = s.tipo_operacao_s and n.cancelada = 'F'
    inner join cfop cf on cf.cfop = pe.cfop
    inner join clientes c on c.cliente = s.cliente
    INNER JOIN L2 ON s.cliente = L2.cli AND n.data = L2.UltimaData
    left join funcionarios fun on fun.funcionario = s.funcionario
    where s.data BETWEEN '01/01/16' AND '03/29/16'
        and pe.quantidade <> 0
        and cf.nat_operacao in('5.101','6.101','5.102','5.403','6.102','6.107','6.108','6.403','5.551','6.551','5.933','6.933','7.551','6.108','6.109','6.110','7.101','7.102')
    group by 1,2,3
) as filtro on filtro.cliente = c.cliente

Compartilhar este post


Link para o post
Compartilhar em outros sites

faria duas queries com union

 

1) select dos clientes sem compra (via outer join)

 

2) select dos clientes que compraram com inner join e testando via subselect o maior

Compartilhar este post


Link para o post
Compartilhar em outros sites

simplifiquei um pouco mais o relacionamento das tabelas e funcionou dessa forma:

WITH UL As(select sai.cliente,  max(sai.data) as ultima_data  from saidas sai where sai.data BETWEEN '01/01/16' AND '03/29/16' group by sai.cliente)
select
    cli.cliente,
    cli.cod_cliente,
    cli.nome,
    fun.nome as consultor,
    s.data as data_ultima_compra,
    sum(s.valor_final) as vl_ultima_compra
from clientes cli
left join UL on UL.cliente = cli.cliente
left join saidas s on s.cliente = UL.cliente and s.data = UL.ultima_data
left join funcionarios fun on fun.funcionario = cli.funcionario
group by 1,2,3,4,5

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.