Ir para conteúdo
Fórum Script Brasil
  • 0

Duas consultas na mesma tabela


luis Romao

Pergunta

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 para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 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'
Editado por Kakao
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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);
Editado por Kakao
Link para o comentário
Compartilhar em outros 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, '[]')
);
Editado por Kakao
Link para o comentário
Compartilhar em outros 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

Editado por luis Romao
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...