UNIÃO DE DOIS SELECTS

Firebird

13/07/2011

COMO FAÇO PARA UNIR ESSES DOIS SELECTS


           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

Sidney Abreu

Curtidas 0

Respostas

Sidney Abreu

Sidney Abreu

13/07/2011

CRIEI ESSA PROCEDURE MAS FICOU MUITO LENTA, DEMORA UNS 30 SEG. PARA MOSTRAR O RESULTADO.

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
Emerson Nascimento

Emerson Nascimento

13/07/2011

o que você espera como resultado dessa pesquisa?
GOSTEI 0
Sidney Abreu

Sidney Abreu

13/07/2011

eu preciso do total do sum(coalesce(it.ven_qtde,0)) de acordo com o grupo, ou seja, o total de qtde cada grupo de produtos
GOSTEI 0
Marco Pinheiro

Marco Pinheiro

13/07/2011

Pelo q vi da consulta, vc deve: - retirar o order by da primeira sentença. - equiparar as colunas. Tanto a qtde de colunas como os tipos devem ser compativeis entre as duas consultas.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/07/2011

independente do vendedor?

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/07/2011

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
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
POSTAR