Fórum Ajuda com union all #477591

29/04/2014

0

Estou utilizando um select com union all para tentar unir as informações somando ou subtraindo as os valores para cada funcionario.
Mais ao executar o código apresenta o seguinte resultado:
Exemplo:
Nome: Valor:
José 100
Maria 50
José -20
Maria -10

Eu gostaria que o resultado da pesquisa fique assim:
José 80
Maria 40

Segue o código que fiz:
select
    fun.nome as consultor,
    sum ((pe.total_liquido + pe.v_ipi) - pe.desc_suframa) as VL_PRODUTO
from produtos_eventos pe
    inner join produtos p on p.produto = pe.produto
    inner join saidas s on s.saida = pe.cod_operacao
    inner join cfop cf on cf.cfop = pe.cfop
    left join funcionarios fun on fun.funcionario = s.funcionario
where s.data BETWEEN ''02/01/14'' AND ''02/28/14''
    and pe.quantidade <> 0
    and cf.nat_operacao in(''5.101'',''6.101'',''5.102'',''6.102'',''6.107'',''5.551'',''6.551'',''5.933'',''6.933'',''7.551'',''6.108'',''6.109'',''6.110'',''7.101'',''7.102'')
group by fun.nome

union all

select
    fun.nome as consultor,
    sum ((pe.total_liquido + pe.v_ipi) - pe.desc_suframa)* -1 as VL_PRODUTO
from produtos_eventos pe
    inner join produtos p on p.produto = pe.produto
    inner join entradas en on en.entrada = pe.cod_operacao and pe.tipo_operacao = en.tipo_operacao_e and en.cancelada = ''F''
    inner join cfop cf on cf.cfop = pe.cfop
    left join funcionarios fun on fun.funcionario = en.funcionario
where en.data BETWEEN ''02/01/14'' AND ''02/28/14''
    and cf.nat_operacao in(''1.201'',''2.201'',''1.202'',''2.202'',''2.203'',''3.201'',''3.202'')
group by fun.nome

union all

select
    fun.nome as consultor,
    sum ((pe.total_liquido + pe.v_ipi) - pe.desc_suframa)* -1 as VL_PRODUTO
from produtos_eventos pe
    inner join produtos p on p.produto = pe.produto
    inner join entradas en on en.entrada = pe.cod_operacao and pe.tipo_operacao = en.tipo_operacao_e and en.cancelada = ''F''
    inner join cfop cf on cf.cfop = pe.cfop
    left join funcionarios fun on fun.funcionario = en.funcionario
where en.data BETWEEN ''02/01/14'' AND ''02/28/14''
    and cf.cfop in(''107'',''125'',''153'',''155'')
group by fun.nome;


Alguém poderia me ajudar com esse código]?
Giuliano Santos

Giuliano Santos

Responder

Posts

30/04/2014

Alex Lekao

Ola Bom dia!!!

Como ficou o resultado? seria possivel posta-lo?

Nao sei se eh possivel com o Firebird mas vc ja experimentou coloca esse codigo todo em uma especie de tabela temporaria e fazer os calculos nela para ver se funciona?

Abraco.

Alex - Lekao
Responder

Gostei + 0

30/04/2014

Giuliano Santos

Bom dia Alex,

consegui resolver esse problema agora pouco utilizando subquery. O código ficou assim:
select consultor,
       sum (VL_PRODUTO)
from
    (
    select
        fun.nome as consultor,
        sum ((pe.total_liquido + pe.v_ipi) - pe.desc_suframa) as VL_PRODUTO
    from produtos_eventos pe
    inner join produtos p on p.produto = pe.produto
    inner join saidas s on s.saida = pe.cod_operacao
    inner join cfop cf on cf.cfop = pe.cfop
    left join funcionarios fun on fun.funcionario = s.funcionario
    where s.data BETWEEN '02/01/14' AND '02/28/14'
        and pe.quantidade <> 0
        and cf.nat_operacao in('5.101','6.101','5.102','6.102','6.107','5.551','6.551','5.933','6.933','7.551','6.108','6.109','6.110','7.101','7.102')
    group by fun.nome

    union all

    select
        fun.nome as consultor,
        sum ((pe.total_liquido + pe.v_ipi) - pe.desc_suframa)* -1 as VL_PRODUTO
    from produtos_eventos pe
    inner join produtos p on p.produto = pe.produto
    inner join entradas en on en.entrada = pe.cod_operacao and pe.tipo_operacao = en.tipo_operacao_e and en.cancelada = 'F'
    inner join cfop cf on cf.cfop = pe.cfop
    left join funcionarios fun on fun.funcionario = en.funcionario
    where en.data BETWEEN '02/01/14' AND '02/28/14'
        and cf.nat_operacao in('1.201','2.201','1.202','2.202','2.203','3.201','3.202')
    group by fun.nome

    union all

    select
        fun.nome as consultor,
        sum ((pe.total_liquido + pe.v_ipi) - pe.desc_suframa)* -1 as VL_PRODUTO
    from produtos_eventos pe
    inner join produtos p on p.produto = pe.produto
    inner join entradas en on en.entrada = pe.cod_operacao and pe.tipo_operacao = en.tipo_operacao_e and en.cancelada = 'F'
    inner join cfop cf on cf.cfop = pe.cfop
    left join funcionarios fun on fun.funcionario = en.funcionario
    where en.data BETWEEN '02/01/14' AND '02/28/14'
        and cf.cfop in('107','125','153','155')
    group by fun.nome
) virtual
group by consultor
Responder

Gostei + 0

30/04/2014

Alex Lekao

kkkk....

era justamente isso que ia te sugerir fazer, eu nao sabia que dava certo com Firebird. rsrsr

Eu uso muito esse recurso no SQL Server. rsrsr

Que bom que deu certo. Parabens!!!

obrigado por postar a solucao.

Abraco.

Alex - Lekao
Responder

Gostei + 0

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

Aceitar