Logo Hardware.com.br
Felipe Nicolodi
Felipe Nicol... Novo Membro Registrado
10 Mensagens 0 Curtidas

Script SQL Oracle

#1 Por Felipe Nicol... 05/08/2015 - 16:21
Boa tarde Pessoal,

Acompanho o fórum há algum tempo, porém este é o primeiro tópico que crio.

Eu preciso montar um script em que mostre todos pedidos de compra vindo de um certo fornecedor, até aí eu consegui fazer, segue o script:

SELECT a.codprod,
b.descricao,
b.unidade,
SUM (NVL (a.qtpedida, 0)) AS qtpedida,
SUM (NVL (a.qtentregue, 0)) AS qtentregue,
SUM (NVL (a.qtpedida, 0) - NVL (a.qtentregue, 0)) AS qtsaldo
FROM pcitem a,
pcprodut b,
pcest c,
pcfornec d,
pcpedido e
WHERE e.dtemissao >= '01-JAN-2015'
AND e.dtemissao <= '31-DEC-2015'
AND a.codprod = b.codprod
AND a.numped = e.numped
AND a.codprod = c.codprod
AND b.codfornec = d.codfornec(+)
AND c.codfilial = e.codfilial
AND c.codfilial = 1
AND e.codfilial = 1
AND d.codfornec = 56
AND NVL (a.qtpedida, 0) > NVL (a.qtentregue, 0)
GROUP BY a.codprod, b.descricao, b.unidade
ORDER BY b.descricao;

Porém desta forma aparecem apenas os produtos deste fornecedor que tem pedidos mesmo, mas eu gostaria que aparecesse também os que não tem pedido, por exemplo:
CODPROD DESCRICAO UNIDADE QTPEDIDA QTENTREGUE QTSALDO
1 PRODUTO A LT 2000 480 1520
2 PRODUTO B LT 0 0 0 (No script atual, este produto não apareceria, pois não existe "qtpedida")
3 PRODUTO C LT 1000 0 1000


Também não sei se a forma que escrevi está 100%, pois ainda tenho pouca experiencia com SQL.
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#2 Por esquiloesper...
06/08/2015 - 11:12
Se você quer visualizar as ocorrências que não têm a quantidade pedida - ou seja, existindo ou não pedidos - essas cláusulas não fazem sentido:

AND a.numped = e.numped
e
AND NVL (a.qtpedida, 0) > NVL (a.qtentregue, 0)

- Melhorando a query ou eliminando estas cláusulas você consegue o mesmo efeito se adicionar os critérios no GROUP BY.

Obs.: Como está ela funciona consumindo muitos recursos de processamento. O ideal seria criar uma 'view' residente única usando JOIN e também para os outros fornecedores sempre buscar os resultados nela.
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
Felipe Nicolodi
Felipe Nicol... Novo Membro Registrado
10 Mensagens 0 Curtidas
#3 Por Felipe Nicol...
06/08/2015 - 15:14
esquiloesperto disse:
Se você quer visualizar as ocorrências que não têm a quantidade pedida - ou seja, existindo ou não pedidos - essas cláusulas não fazem sentido:

AND a.numped = e.numped
e
AND NVL (a.qtpedida, 0) > NVL (a.qtentregue, 0)

- Melhorando a query ou eliminando estas cláusulas você consegue o mesmo efeito se adicionar os critérios no GROUP BY.

Obs.: Como está ela funciona consumindo muitos recursos de processamento. O ideal seria criar uma 'view' residente única usando JOIN e também para os outros fornecedores sempre buscar os resultados nela.


Obrigado por responder esquiloesperto,

Seguinte, eu tirei essas duas cláusulas porém não resolveu o problema, ao tirar o "AND a.numped = e.numped" ele ainda mostra os mesmo produtos, porem aumenta consideravelmente a quantidade dos produtos (exemplo, tenho o produto "x" que tem 10.000 qtpedida ( e nada disso foi entregue), ele passa a mostrar 294.000). E se tirar o "AND NVL (a.qtpedida, 0) > NVL (a.qtentregue, 0)" a unica coisa que vai acontecer é que o resultado irá mostrar pedidos que já foram totalmente entregues, mas não traz produtos sem quantidade pedida.
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#6 Por esquiloesper...
06/08/2015 - 16:24
Amigo e nobre Felipe...

Você quer listar os itens que não têm pedidos; Ora, se o pedido não existe como você espera que ver alguma coisa com isto:

AND c.codfilial = e.codfilial

- E tem mais lá! Você precisa fazer a sua parte.
Uma das assinaturas neste fórum diz: "Não dou o peixe, ensino a pescar"... Porém meu amigo, sem esforço não há aprendizado.

...
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
Felipe Nicolodi
Felipe Nicol... Novo Membro Registrado
10 Mensagens 0 Curtidas
#7 Por Felipe Nicol...
07/08/2015 - 09:22
Obrigado pela ajuda esquiloesperto,

Como eu disse no inicio, tenho pouca experiencia em SQL, apenas uns 2 meses e como estou aprendendo tudo sozinho, ainda tem certos pontos que são complexos para mim...

Mas pelos testes que eu fiz, a tabela "a" onde armazena os produtos dos pedidos, só mostra produtos que já fizeram parte de pelo menos 1 pedido, então enquanto não for feito pelo menos 1 pedido de cada um dos produtos, estes não iram aparecer nessa tabela... Portanto, independente do que eu faça, não tem como fazer todos eles aparecerem(até ser tirado ao menos 1 pedido de cada), pelo menos foi nessa conclusão que cheguei.
andremachado
andremachado Highlander Registrado
3.3K Mensagens 2K Curtidas
#8 Por andremachado
07/08/2015 - 13:13
Cara, não quero ser pessimista, mas pelo que vi parece que as tabelas a e e têm informacoes desnecessariamente duplicadas, o que aumentar complica o trabalho. Se a é onde aparecem os itens dos pedidos e e onde estão os pedidos em si, não seria melhor colocar uma PK em a e só ir relacionando esse valor como FK em e?

Além disso, de uma olhada nos left, inner e right join. Talvez seja o q VC quer.
56 6F 63 EA 20 E9 20 6D 75 69 74 6F 20 63 75 72 69 6F 73 6F 2E 2E 2E
----------------------------------------
Acer Aspire E5-471-30DG (Casa)
Samsung Book 550XDA-K07 (Trabalho)
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal