[OFF] Consulta SQL

17 views
Skip to first unread message

Gustavo Almeida

unread,
Oct 15, 2012, 7:35:24 PM10/15/12
to dotn...@googlegroups.com
Povo...

Eu sou fraco com consultas SQL complexas. Ser� que algu�m poderia me
dizer, pelo menos, quais comandos devo procurar???

Minha situa��o � a seguinte:

Um controle de vendas "simples"
Tenhos as seguintes tabelas:

PRODUTOS
- Id_Produto
- Nome

VENDAS
-Id_venda
-NotaFiscal

PRODUTOSVENDAS
- Id_Produto (linkado ao Id_Produto da tabela de produtos)
- Id_Venda (linkado ao Id_Venda da tabela de vendas)
- Quantidade


As tabelas, obviamente possuem mais campos. Mas pro que eu preciso, os
campos principais s�o esses.

O funcionamento, creio que n�o � mist�rio pra ningu�m.
Quando se faz uma VENDA no sistema, inclui-se uma linha na tabela VENDAS
e na tabela PRODUTOSVENDA s�o cadastrados os produtos daquela venda.

Agora vem a parte que estou "agarrado".
Este sistema � usado de forma que o campo NOTAFISCAL, na tabela Vendas,
pode ser preenchido com ZERO (0).

Eu preciso, atrav�s de uma consulta SQL, pegar os produtos da tabela
PRODUTOSVENDA que fazem parte de vendas com o campo NotaFiscal ZERO.

Um exemplo pr�tico:


VENDAS
Id:1 NotaFiscal: 123
Id:2 NotaFiscal: 0
Id:3 NotaFiscal: 0



PRODUTOS
Id_Produto: 1 Nome: Produto A
Id_Produto: 2 Nome: Produto B




PRODUTOSVENDAS
Id_Produto: 1 Id_Venda: 1 Quantidade: 1
Id_Produto: 2 Id_Venda: 2 Quantidade: 2
Id_Produto: 1 Id_Venda: 2 Quantidade: 1
Id_Produto: 1 Id_Venda: 3 Quantidade: 1



Veja que, neste caso, observando a tabela PRODUTOS VENDA, eu consigo
saber que:

2 PRODUTO B e 2 PRODUTO A foram
vendidos com vendas em n�mero da NOTAFISCAL zero.


Mas como a tabela possui milh�es de registros, vai ficar muito lento se
eu percorrer as tabelas todas, separando isso.
Imagino que seja poss�vel trazer esse resultado que eu quero com uma
�nica instru��o SQL, s� que eu n�o sei como.
N�o sei nem o que estudar. Acredito que eu v� precisar de mais do que um
simples INNER JOIN.

Algu�m a� entendeu o que eu preciso?!?!?! Poderiam me dar uma LUZ???

Gustavo Almeida

unread,
Oct 15, 2012, 7:35:39 PM10/15/12
to dotn...@googlegroups.com

Paulo S. M. Marques

unread,
Oct 15, 2012, 8:42:42 PM10/15/12
to dotn...@googlegroups.com

select top 100 a.*, b.*, c.*

from produtos a, vendas b, produtosvendas c

where c.idproduto = a.idproduto
and c.idvenda = b.idvenda

mais facil impossivel...
qq coisa mete uma paginacao passando o ultimo id,
where id > 100, 200, 300, etc...

Em 15/10/2012 20:35, "Gustavo Almeida" <gus...@gmasoftwares.com.br> escreveu:
Povo...

Eu sou fraco com consultas SQL complexas. Será que alguém poderia me dizer, pelo menos, quais comandos devo procurar???

Minha situação é a seguinte:


Um controle de vendas "simples"
Tenhos as seguintes tabelas:

PRODUTOS
- Id_Produto
- Nome

VENDAS
-Id_venda
-NotaFiscal

PRODUTOSVENDAS
- Id_Produto (linkado ao Id_Produto da tabela de produtos)
- Id_Venda (linkado ao Id_Venda da tabela de vendas)
- Quantidade


As tabelas, obviamente possuem mais campos. Mas pro que eu preciso, os campos principais são esses.

O funcionamento, creio que não é mistério pra ninguém.
Quando se faz uma VENDA no sistema, inclui-se uma linha na tabela VENDAS e na tabela PRODUTOSVENDA são cadastrados os produtos daquela venda.


Agora vem a parte que estou "agarrado".
Este sistema é usado de forma que o campo NOTAFISCAL, na tabela Vendas, pode ser preenchido com ZERO (0).

Eu preciso, através de uma consulta SQL, pegar os produtos da tabela PRODUTOSVENDA que fazem parte de vendas com o campo NotaFiscal ZERO.

Um exemplo prático:



VENDAS
Id:1      NotaFiscal: 123
Id:2      NotaFiscal: 0
Id:3      NotaFiscal: 0



PRODUTOS
Id_Produto: 1               Nome: Produto A
Id_Produto: 2               Nome: Produto B




PRODUTOSVENDAS
Id_Produto: 1              Id_Venda: 1             Quantidade: 1
Id_Produto: 2              Id_Venda: 2             Quantidade: 2
Id_Produto: 1              Id_Venda: 2             Quantidade: 1
Id_Produto: 1              Id_Venda: 3             Quantidade: 1



Veja que, neste caso, observando a tabela PRODUTOS VENDA, eu consigo saber que:

2 PRODUTO B         e           2 PRODUTO A                foram vendidos com vendas em número da NOTAFISCAL zero.


Mas como a tabela possui milhões de registros, vai ficar muito lento se eu percorrer as tabelas todas, separando isso.
Imagino que seja possível trazer esse resultado que eu quero com uma única instrução SQL, só que eu não sei como.
Não sei nem o que estudar. Acredito que eu vá precisar de mais do que um simples INNER JOIN.

Alguém aí entendeu o que eu preciso?!?!?! Poderiam me dar uma LUZ???

--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================

Luiz Estevam

unread,
Oct 15, 2012, 11:02:04 PM10/15/12
to dotn...@googlegroups.com
Gustavo, só uma observação na resposta do Paulo, como a query está com inner join, caso existam vendas com produtos que não existem mais, você não perceberá isto nesta query, creio que seja melhor fazer um left join entre as tabelas produtosvendas e produtos, assim você saberá também se existem registros órfãos na tabela produtosvendas.

Estevam
--
Luiz Estevam Barros
lest...@gmail.com

Paulo S. M. Marques

unread,
Oct 16, 2012, 12:25:27 AM10/16/12
to dotn...@googlegroups.com

issoae...

Marcus Alexandre Silva

unread,
Oct 16, 2012, 5:59:38 AM10/16/12
to dotn...@googlegroups.com

Caso existam vendas com produtos que não existam mais não traze-los na sql será o menor dos problemas... Quase tão grave quanto ter que recuperar uma noa de abril cujo nome do produto tenha sido alterado em julho... Pense nisto!

Em 16/10/2012 00:02, "Luiz Estevam" <lest...@gmail.com> escreveu:

Gustavo Almeida

unread,
Oct 16, 2012, 8:47:51 AM10/16/12
to dotn...@googlegroups.com
Valeu, galera!!!

Vou testar aqui e ver se vou conseguir montar a query certinho.

E sobre os registros órfãos, o sistema não permite que isso ocorra.
Então, não haverá vendas de produtos excluídos.

Obrigado mesmo, pela ajuda!!!

Abraços!!!

Pedro Marques

unread,
Oct 16, 2012, 4:59:24 PM10/16/12
to dotn...@googlegroups.com
Não sei se entedi muito bem,  mas acho que so com inner joins resolve o problema:



SELECT P.NOME,
       V.ID
FROM PRODUTO_VENDA PV
INNER JOIN PRODUTO P ON P.ID = PV.ID_PRODUTO
INNER JOIN VENDA V ON V.ID = PV.ID_VENDA
WHERE V.NOTAFISCAL = 0


Agora para pegar a quantidade de produtos:



SELECT COUNT(P.ID) AS Quantidade,
       P.NOME
FROM PRODUTO_VENDA PV
INNER JOIN PRODUTO P ON P.ID = PV.ID_PRODUTO
INNER JOIN VENDA V ON V.ID = PV.ID_VENDA
WHERE V.NOTAFISCAL = 0
GROUP BY P.ID,
         P.NOME
Reply all
Reply to author
Forward
0 new messages