Ir para conteúdo

Arquivado

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

Giuliano Santos

union all no Firebird

Recommended Posts

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:
[inline]

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;

[/inline]



Alguem poderia me ajudar com esse código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende se o BD aceita subquery

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Depende se o BD aceita subquery

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

Perfeito Motta, você resolveu o meu problema

muito obrigado

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.