SQL - Usar valor de where em outra where
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
Curtidas 0
Respostas
Emerson Nascimento
11/12/2020
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.vendedor
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.
GOSTEI 0
Marcelo Kermessi
11/12/2020
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
GOSTEI 0