Fórum UNIÃO DE DOIS SELECTS #404916
13/07/2011
0
select
vend.vend_nome,
sum(coalesce(it.ven_qtde,0)) as TCig,
from cx_itens it
inner join vendedor vend on (it.vend_id = vend.vend_id)
inner join cx_vendedor cx on (it.cxven_id = cx.cxven_id)
right join produtos p on (it.prod_id = p.prod_id)
left join grupo_prod g on (g.grupo_id = p.grupo_id)
where
it.data between :data_ini and :data_fim and
it.vend_id = cx.vend_id and p.grupo_id = p.grupo_id AND
cx.situacao = 'FECHADO'
group by vend.vend_nome,g.grupo_descricao
order by 2,1
UNION
select
p.prod_id,
p.prod_descricao,
v.vend_id,
vend.vend_nome,
g.grupo_descricao,
------------ Totalização -------------
sum(coalesce(it.ven_qtde,0)) as tqtde,
sum(coalesce(v.ven_total,0)) as faturamento,
sum(coalesce(v.cobranca,0)) as tcobranca,
sum(coalesce(v.retor_cob,0)) as tretorno_cob,
sum(coalesce(v.saldo_cob,0)) as saldo_cob,
sum(coalesce(v.retor_cob,0)+coalesce(v.venda_prazo,0)) as prox,
sum(case
when coalesce(v.cobranca,0) > 0 then
cast((coalesce(v.retor_cob,0) / coalesce(v.cobranca,0))*100 as numeric(15,2))
else
0
end) as inad,
sum(coalesce(v.venda_total,0)) as vtotal
from cx_itens it
inner join cx_vendedor v on (v.cxven_id = it.cxven_id
and v.vend_id = v.vend_id
and v.dt_caixa between :dt_ini and :dt_fim
and v.situacao = 'FECHADO'
)
left join vendedor vend on (vend.vend_id = v.vend_id)
right join produtos p on (it.prod_id = p.prod_id)
left join grupo_prod g on (g.grupo_id = p.grupo_id)
where p.ativo = 'A' and it.ven_qtde is not null
group by p.prod_id, p.prod_descricao, v.vend_id,vend.vend_nome,g.grupo_descricao, p.ativo
order by 5,1,4
Sidney Abreu
Curtir tópico
+ 0Posts
13/07/2011
Sidney Abreu
CREATE PROCEDURE CIG_TESTE (
dt_ini date,
dt_fim date)
returns (
prod_id integer,
prod_descricao varchar(50),
vend_id integer,
vend_nome varchar(50),
grupo_descricao varchar(30),
tqtde numeric(18,3),
faturamento numeric(18,2),
tcobranca numeric(18,2),
tretorno_cob numeric(18,2),
saldo_cob numeric(18,2),
prox numeric(18,2),
inad numeric(18,2),
vtotal numeric(18,2),
tcig numeric(18,3))
as
BEGIN
FOR
select
p.prod_id,
p.prod_descricao,
v.vend_id,
vend.vend_nome,
g.grupo_descricao,
------------ Totalização -------------
sum(coalesce(it.ven_qtde,0)) as tqtde,
sum(coalesce(v.ven_total,0)) as faturamento,
sum(coalesce(v.cobranca,0)) as tcobranca,
sum(coalesce(v.retor_cob,0)) as tretorno_cob,
sum(coalesce(v.saldo_cob,0)) as saldo_cob,
sum(coalesce(v.retor_cob,0)+coalesce(v.venda_prazo,0)) as prox,
sum(case
when coalesce(v.cobranca,0) > 0 then
cast((coalesce(v.retor_cob,0) / coalesce(v.cobranca,0))*100 as numeric(15,2))
else
0
end) as inad,
sum(coalesce(v.venda_total,0)) as vtotal,
(
select
sum(coalesce(it.ven_qtde,0))
from cx_itens it
inner join cx_vendedor cx on (it.cxven_id = cx.cxven_id)
right join produtos p on (it.prod_id = p.prod_id)
left join grupo_prod g on (g.grupo_id = p.grupo_id)
where
it.data between :dt_ini and :dt_fim and
it.vend_id = :vend_id and p.grupo_id = 1 AND
cx.situacao = 'FECHADO'
) as tcig
from cx_itens it
inner join cx_vendedor v on (v.cxven_id = it.cxven_id
and v.vend_id = v.vend_id
and v.dt_caixa between :dt_ini and :dt_fim
and v.situacao = 'FECHADO'
)
left join vendedor vend on (vend.vend_id = v.vend_id)
right join produtos p on (it.prod_id = p.prod_id)
left join grupo_prod g on (g.grupo_id = p.grupo_id)
where p.ativo = 'A' and it.ven_qtde is not null
group by p.prod_id, p.prod_descricao, v.vend_id,vend.vend_nome,g.grupo_descricao, p.ativo
order by 5,1,4
INTO :PROD_ID,
:PROD_DESCRICAO,
:VEND_ID,
:VEND_NOME,
:GRUPO_DESCRICAO,
:TQTDE,
:FATURAMENTO,
:TCOBRANCA,
:TRETORNO_COB,
:SALDO_COB,
:PROX,
:INAD,
:VTOTAL,
:TCIG
DO
BEGIN
SUSPEND;
END
END
Gostei + 0
13/07/2011
Emerson Nascimento
Gostei + 0
13/07/2011
Sidney Abreu
Gostei + 0
13/07/2011
Marco Pinheiro
Gostei + 0
14/07/2011
Emerson Nascimento
Gostei + 0
14/07/2011
Emerson Nascimento
dt_ini date,
dt_fim date)
returns (
prod_id integer,
prod_descricao varchar(50),
vend_id integer,
vend_nome varchar(50),
grupo_descricao varchar(30),
tqtde numeric(18,3),
faturamento numeric(18,2),
tcobranca numeric(18,2),
tretorno_cob numeric(18,2),
saldo_cob numeric(18,2),
prox numeric(18,2),
inad numeric(18,2),
vtotal numeric(18,2),
tcig numeric(18,3))
as
DECLARE VARIABLE GRUPO_ID integer;
BEGIN
FOR
select
p.prod_id,
p.prod_descricao,
v.vend_id,
vend.vend_nome,
g.grupo_descricao,
------------ Totalização -------------
coalesce(sum(it.ven_qtde),0) as tqtde,
coalesce(sum(v.ven_total,0) as faturamento,
coalesce(sum(v.cobranca,0) as tcobranca,
coalesce(sum(v.retor_cob,0) as tretorno_cob,
coalesce(sum(v.saldo_cob,0) as saldo_cob,
coalesce(sum(v.retor_cob,0)+coalesce(v.venda_prazo,0)) as prox,
sum(case when coalesce(v.cobranca,0) > 0
then cast((coalesce(v.retor_cob,0) / coalesce(v.cobranca,0))*100 as numeric(15,2))
else 0 end) as inad,
coalesce(sum(v.venda_total),0) as vtotal,
g.grupo_id
from produtos p
left join cx_itens it on (it.prod_id = p.prod_id and coalesce(it.ven_qtde,0) > 0)
left join cx_vendedor v on (v.cxven_id = it.cxven_id
and v.dt_caixa between :dt_ini and :dt_fim
and v.situacao = 'FECHADO')
left join vendedor vend on (vend.vend_id = v.vend_id)
left join grupo_prod g on (g.grupo_id = p.grupo_id)
where p.ativo = 'A'
group by p.prod_id, p.prod_descricao, v.vend_id, vend.vend_nome, g.grupo_descricao, g.grupo_id
order by g.grupo_descricao, g.grupo_id, p.prod_id, vend.vend_nome
INTO :PROD_ID,
:PROD_DESCRICAO,
:VEND_ID,
:VEND_NOME,
:GRUPO_DESCRICAO,
:TQTDE,
:FATURAMENTO,
:TCOBRANCA,
:TRETORNO_COB,
:SALDO_COB,
:PROX,
:INAD,
:VTOTAL,
:GRUPO_ID
DO
BEGIN
select coalesce(sum(it.ven_qtde),0)
from cx_itens it
inner join cx_vendedor v on (v.cxven_id = it.cxven_id
and v.dt_caixa between :dt_ini and :dt_fim
and v.situacao = 'FECHADO')
inner join produtos p on (p.prod_id = it.prod_id and p.grupo_id = :GRUPO_ID)
-- where it.vend_id = :vend_id
into :TCIG;
SUSPEND;
END
END
para melhorar a performance você deve criar um índice (caso ainda não tenha criado):
cx_vendedor
-----------
cxven_id, dt_caixa, situacao
produtos
--------
prod_id, grupo_id
(pressupondo que os índices para os campos chave já estejam criados)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)