Jump to content
Fórum Script Brasil
  • 0

Duas consultas na mesma tabela


Question

Bom dia pessoal, tudo bem. Estou aqui novamente para sanar as minhas dúvidas.

Tenho uma tabela de vendas, gostaria de trazer as informações de vendas comparando com o ano anterior.

Produto | quant2014 | valor2014 | quant2015 | valor2015

é possivel fazer isso, tentei com union, com view, mas não tive sucesso.

SELECT
"public".dim_produto.nome,
"public".fato_vendas_franquias.valortotal,
"public".fato_vendas_franquias.pecas
FROM
"public".fato_vendas_franquias
INNER JOIN "public".dim_produto ON "public".dim_produto.sk_codpro = "public".fato_vendas_franquias.sk_codpro
WHERE
"public".fato_vendas_franquias."data" BETWEEN '2015-03-01' AND '2015-03-05'

Obrigado até o momento

Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0
select
    p.nome,
    sum(v.pecas * (extract(year from v.data) = 2014)::int) as quant2014,
    sum(v.valortotal * (extract(year from v.data) = 2014)::int) as valor2014,
    sum(v.pecas * (extract(year from v.data) = 2015)::int) as quant2015,
    sum(v.valortotal * (extract(year from v.data) = 2015)::int) as valor2015
from
    public.fato_vendas_franquias v
    inner join
    public.dim_produto p on p.sk_codpro = v.sk_codpro
where v.data >= '2014-01-01' and v.data < '2016-01-01'
Edited by Kakao
Link to post
Share on other sites
  • 0

Perfeito Kakao,

Apenas adicionei o group by

select
p.nome,
p.codpro,
sum(v.pecas * (extract(year from v.data) = 2014)::int) as quant2014,
sum(v.valortotal * (extract(year from v.data) = 2014)::int) as valor2014,
sum(v.pecas * (extract(year from v.data) = 2015)::int) as quant2015,
sum(v.valortotal * (extract(year from v.data) = 2015)::int) as valor2015
from
public.fato_vendas_franquias v
inner join
public.dim_produto p on p.sk_codpro = v.sk_codpro
where v.data >= '2014-01-01' and v.data < '2016-01-01'
GROUP BY p.nome,p.codpro
ORDER BY p.codpro asc

Muito obrigado!!!

Link to post
Share on other sites
  • 0

Aí tem que ser função:

create or replace function compare_vendas(ano_1 int, ano_2 int)
returns table(
    nome text, codpro text,
    quant_ano_1 bigint, valor_ano_1 numeric,
    quant_ano_2 bigint, valor_ano_2 numeric
) as $$

    select
        p.nome, p.codpro,
        sum(v.pecas * (extract(year from v.data) = ano_1)::int),
        sum(v.valortotal * (extract(year from v.data) = ano_1)::int),
        sum(v.pecas * (extract(year from v.data) = ano_2)::int),
        sum(v.valortotal * (extract(year from v.data) = ano_2)::int)
    from
        public.fato_vendas_franquias v
        inner join
        public.dim_produto p on p.sk_codpro = v.sk_codpro
    where
        v.data >= ano_1::text || '-01-01' and
        v.data < (ano_2 + 1)::text || '-01-01'
    group by p.nome, p.codpro
    order by p.codpro asc;

$$ language sql;
Se necessário substitua os tipos das colunas retornadas pela função pelos tipos adequados.

Para chamar:

select *
from compare_vendas(2014, 2015);
Edited by Kakao
Link to post
Share on other sites
  • 0

Luis, eu só vi agora que você editou a última pergunta. Então fica assim:

create or replace function compare_vendas(
    range_1 daterange,
    range_2 daterange
) returns table(
    nome text, codpro text,
    quant_range_1 bigint, valor_range_1 numeric,
    quant_range_2 bigint, valor_range_2 numeric
) as $$

    select
        p.nome, p.codpro,
        sum(v.pecas * (v.data <@ range_1)::int),
        sum(v.valortotal * (v.data <@ range_1)::int),
        sum(v.pecas * (v.data <@ range_2)::int),
        sum(v.valortotal * (v.data <@ range_2)::int)
    from
        public.fato_vendas_franquias v
        inner join
        public.dim_produto p on p.sk_codpro = v.sk_codpro
    where
        v.data <@ range_1 or
        v.data <@ range_2
    group by p.nome, p.codpro
    order by p.codpro asc;

$$ language sql;
Estou supondo que fato_vendas_franquias.data seja to tipo date. O tipo daterange com suas funções facilita este tipo de comparação.

Se for construir a chamada manualmente é mais fácil fazer o cast

select *
from compare_vendas(
    '[2013-05-01, 2013-05-15]'::daterange,
    '[2014-05-01, 2014-05-15]'::daterange
);
Se for passar os parâmetros pelo cliente é melhor usar o construtor

select *
from compare_vendas(
    daterange('2013-05-01'::date, '2013-05-15'::date, '[]'),
    daterange('2014-05-01'::date, '2014-05-15'::date, '[]')
);
Edited by Kakao
Link to post
Share on other sites
  • 0

Bom dia Kakao, me ajude novamente nesse select.

SELECT
"public".dim_produto.nome,
"public".fato_vendas_franquias.valortotal,
"public".fato_vendas_franquias.pecas
FROM
"public".fato_vendas_franquias
INNER JOIN "public".dim_produto ON "public".dim_produto.sk_codpro = "public".fato_vendas_franquias.sk_codpro
WHERE
"public".fato_vendas_franquias."data" BETWEEN '2015-03-10' AND '2015-03-20'

Preciso do mesmo periodo do ano anteior. Você acha que dá? Nesse primeiro momento não vou passar para o Cliente, preciso só da informação.

Obrigado

Edited by luis Romao
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      148876
    • Total Posts
      644882
×
×
  • Create New...