SQL - Usar valor de where em outra where

11/12/2020

0

SQL

Olá Não sou programador, apenas um curioso desenvolvendo uns relatorios basicos do sistema da empresa.

Gostaria de saber se consigo usar os valores de um where (das notas faturadas) em outra where (dos pedidos realizados). Estou agrupando os pedidos realizados por vendedores em um periodo e as notas faturadas daquele vendedor naquele mesmo periodo, mas essas informações são de tabelas diferentes. Uso um editor basico que roda dentro do proprio sistema. Tentei fuçar com declaração de variaveis, mas aparentemente ele não aceita o "@".

Abaixo segue o procedimento:

Select
a.vendedor,
a.NNotas,
a.VNotas,
b.NPed,
b.VPed
from(select s.vendedor, Count(s.saida_id) NNotas, sum(s.valorproduto) VNotas
from saida s
WHERE extract(month from S.DATA) = :pmes and extract (year from S.DATA) = :pano AND s.ativo='Y' AND S.natureza=0
group by s.vendedor) as A
Inner Join (select p.vendedor, Count(p.pedido_id) NPed,
sum(p.valorproduto) VPed
From pedido p
WHERE extract(month from P.DATA) = 11 and extract (year from P.DATA) =2020 and (p.tipovenda in ('00001','00004','00005','00011','00013'))
group by p.vendedor) As B On a.vendedor = b.vendedor
Desse jeito consigo os resultados , porém preciso colocar o mes e o ano 2 vezes...uma para faturamento, outra para pedidos.

Fico no aguardo. Obrigado
Marcelo Kermessi

Marcelo Kermessi

Responder

Posts

11/12/2020

Emerson Nascimento

o mês e o ano são os mesmos? não deu certo apenas repetindo o parâmetro?
Select
	a.vendedor,
	a.NNotas,
	a.VNotas,
	b.NPed,
	b.VPed
from
(
	select s.vendedor, Count(s.saida_id) NNotas, sum(s.valorproduto) VNotas
	from saida s
	WHERE extract(month from S.DATA) = :pmes and extract (year from S.DATA) = :pano AND s.ativo='Y' AND S.natureza=0
	group by s.vendedor
) as A
Inner Join (
	select p.vendedor, Count(p.pedido_id) NPed,
	sum(p.valorproduto) VPed
	From pedido p
	WHERE extract(month from P.DATA) = :pmes and extract (year from P.DATA) = :pano and (p.tipovenda in ('00001','00004','00005','00011','00013'))
	group by p.vendedor
) As B On a.vendedor = b.vendedor
Obs.: da forma como foi montada, a instrução NÃO vai funcionar para todos os casos.
por exemplo: se houver pedidos no mês 10/2020 mas NÃO houver notas, os dados dos pedidos não serão apresentados.

se a repetição de parâmetros funcionar, faça algo assim:
Select
	VEND.vendedor,
	coalesce(A.NNotas,0) NNotas, -- coalesce: porque posso não ter faturamento no período
	coalesce(A.VNotas,0) VNotas, -- coalesce: porque posso não ter faturamento no período
	coalesce(B.NPed,0) NPed, -- coalesce: porque posso não ter pedidos no período
	coalesce(B.VPed,0) VPed -- coalesce: porque posso não ter pedidos no período
from
(
	select s.vendedor from saida s
	where extract(month from S.DATA) = :pmes and extract(year from S.DATA) = :pano AND s.ativo='Y' AND S.natureza=0
	group by s.vendedor
	union 
	select p.vendedor from pedido p
	where extract(month from P.DATA) = :pmes and extract(year from P.DATA) = :pano and (p.tipovenda in ('00001','00004','00005','00011','00013'))
	group by p.vendedor
) as VEND -- você precisa de todos os vendedores possíveis
left join
(
	select s.vendedor, count(s.saida_id) NNotas, sum(s.valorproduto) VNotas
	from saida s
	where extract(month from S.DATA) = :pmes and extract (year from S.DATA) = :pano AND s.ativo='Y' AND S.natureza=0
	group by s.vendedor
) as A on A.vendedor = VEND.vendedor
left join
(
	select p.vendedor, count(p.pedido_id) NPed, sum(p.valorproduto) VPed
	from pedido p
	where extract(month from P.DATA) = :pmes and extract (year from P.DATA) = :pano and (p.tipovenda in ('00001','00004','00005','00011','00013'))
	group by p.vendedor
) as B On B.vendedor = VEND.vendedor

se a repetição do parâmetro NÃO funcionar, tente assim (a performance vai cair bastante):
select
	VEND.vendedor,
	coalesce(A.NNotas,0) NNotas, -- coalesce: porque posso não ter faturamento no período
	coalesce(A.VNotas,0) VNotas, -- coalesce: porque posso não ter faturamento no período
	coalesce(B.NPed,0) NPed, -- coalesce: porque posso não ter pedidos no período
	coalesce(B.VPed,0) VPed -- coalesce: porque posso não ter pedidos no período
from
(
	select v.vendedor, :pmes MES, :pano ANO from tabela_vendedores
) VEND
left join
(
	select s.vendedor, extract(month from S.DATA) MES, extract(year from S.DATA) ANO, count(s.saida_id) NNotas, sum(s.valorproduto) VNotas
	from saida s
	where s.ativo='Y' AND S.natureza=0
	group by s.vendedor, extract(month from S.DATA), extract(year from S.DATA)
) as A on A.vendedor = VEND.vendedor and A.MES = VEND.MES and A.ANO = VEND.ANO
left Join
(
	select p.vendedor, extract(month from P.DATA) MES, extract(year from P.DATA) ANO, count(p.pedido_id) NPed, sum(p.valorproduto) VPed
	from pedido p
	where (p.tipovenda in ('00001','00004','00005','00011','00013'))
	group by p.vendedor, extract(month from P.DATA), extract(year from P.DATA)
) as B On B.vendedor = VEND.vendedor and B.MES = VEND.MES and B.ANO = VEND.ANO

porque usar left join?
porque você pode ter notas fiscais mas não ter pedidos (ou vice-versa) e a falta de um acabaria anulando a exibição dos dados do outro.

Responder

11/12/2020

Marcelo Kermessi

Obrigado Emerson
O mes e o ano são os mesmos.
Na primeira possibilidade q voce passou deu um erro sobre o parametro :pmes que ele não reconhece
Na segunda possibilidade deu um erro de não encontrar a variavel mes, criada a partir do :pmes.

Entendi seu questionamento sobre a falta de resultados de um, não mostrar os resultados do outro e vice virsa. Faz todo sentido. Poderia ser criterioso, mas nesse caso tenho certeza de todo mes ter pedidos e notas faturadas sem exceçao.

E o ultimo questionamento de usar o left...eu desconheço totalmente a linguagem, estou me aventurando. Sou da area de mecanica mas estou participando da implantação de um sistema na empresa, dai gostaria de relatorios mais prontos ao invés de manipular eles separados no excel.

Desde já, muito obrigado pela ajuda
Valeu
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar