Fórum SQL - Usar valor de where em outra where #613495
11/12/2020
0
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
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
Curtir tópico
+ 0
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?
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:
se a repetição do parâmetro NÃO funcionar, tente assim (a performance vai cair bastante):
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.
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.vendedorpor 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.vendedorse 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.ANOporque 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
Gostei + 0
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
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)