Junçao de dois Codigos em SQL

Firebird

21/10/2014

Preciso fazer a junção desses dois codigo de vendas e compras pelo tipo de modelo, quando junto os dois, começa a
dar erro nos valores de estoque, mas quando faço separadamente ele dar o resultado certinho,
tem alguem aí poderia me ajudar a juntar esses dois codigo sem que dê problema no valores.
SELECT ESTOQUE.CODIGO,
ESTOQUE.NOME,
SUM(ITECOMPRAS.QTD) AS COMPRAS,
COMPRAS.MODELO
FROM ESTOQUE,ITECOMPRAS,COMPRAS
WHERE ESTOQUE.CODIGO=ITECOMPRAS.CODIGO AND
ITECOMPRAS.NOTA=COMPRAS.NOTA AND
COMPRAS.MODELO='01'
GROUP BY ESTOQUE.CODIGO,
ESTOQUE.NOME,
COMPRAS.MODELO



SELECT ITEVENDAS.CODIGO,
SUM(ITEVENDAS.QTD) QTD_VENDA,
ESTOQUE.NOME
FROM ITEVENDAS,ESTOQUE
WHERE ITEVENDAS.CODIGO=ESTOQUE.CODIGO AND
ITEVENDAS.MODELO='01'
GROUP BY ITEVENDAS.CODIGO,
ESTOQUE.NOME
Tiago Rodrigues

Tiago Rodrigues

Curtidas 0

Respostas

Wander Santos

Wander Santos

21/10/2014

Utiliza o union no final o primeiro select


select ......

union

select...
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Ja tentei amigo, nao deu certo.
GOSTEI 0
Wander Santos

Wander Santos

21/10/2014

Roda as querys separadas e ve se da algum erro.
Pq com o Union era pra da certo
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

Testa esse SELECT pra ver se funciona:
SELECT ESTOQUE.CODIGO,
       ESTOQUE.NOME,
       COMPRAS.MODELO AS MODELOVENDA, 
       ITEVENDAS.MODELO AS MODELOCOMPRA,
       SUM(ITECOMPRAS.QTD) AS COMPRAS,
       SUM(ITEVENDAS.QTD) AS QTD_VENDA    
FROM ESTOQUE
INNER JOIN ITECOMPRAS
ON ESTOQUE.CODIGO =ITECOMPRAS.CODIGO 
INNER JOIN COMPRAS
ON ITECOMPRAS.NOTA=COMPRAS.NOTA
INNER JOIN ITEVENDAS
ON ESTOQUE.CODIGO = ITEVENDAS.CODIGO
WHERE COMPRAS.MODELO='01'
AND ITEVENDAS.MODELO='01'
GROUP BY ESTOQUE.CODIGO,
         ESTOQUE.NOME,
         COMPRAS.MODELO,
        ITEVENDAS.MODELO
ORDER BY ESTOQUE.CODIGO,
         ESTOQUE.NOME,
         COMPRAS.MODELO,
         ITEVENDAS.MODELO

Acredito q o motivo pelo qual retorna dados errado é que no segundo vc inclui o ITEVENDAS.CODIGO e no primeiro o ESTOQUE.CODIGO isso, logicamente, faz agrupamentos de dados diferentes e por isso os resultados são diferentes.
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Marisiana, Ocorreu a mesma coisa que aconteceu quando fiz a junção dos condigo, a forma foi diferente, mas
a logica foi a mesma, olha o que aconteceu tanto no meu codigo quanto o seu.
Exemplo: Dei uma entrada de nota do Produto A de 50 quantidades e fiz uma venda do mesmo de 2. Depois outra
entrada de mais 30 produtos A no estoque, automaticamente ele duplica o total de venda para 4, ou seja, sempre
que dou uma entrada, o valor da venda sempre duplica...Outra coisa que acontece tambem, so vai aparecer no meu
relatorio se pelo menos tiver uma compra ou uma venda para o mesmo produto, se tiver so uma compra ou so uma
venda, ele nao aparece.
Obrigado a todos !!
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Roda as querys separadas e ve se da algum erro.
Pq com o Union era pra da certo


Ele separado roda sem nenhum problema.

Obrigado !!!
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Testa esse SELECT pra ver se funciona:
SELECT ESTOQUE.CODIGO,
       ESTOQUE.NOME,
       COMPRAS.MODELO AS MODELOVENDA, 
       ITEVENDAS.MODELO AS MODELOCOMPRA,
       SUM(ITECOMPRAS.QTD) AS COMPRAS,
       SUM(ITEVENDAS.QTD) AS QTD_VENDA    
FROM ESTOQUE
INNER JOIN ITECOMPRAS
ON ESTOQUE.CODIGO =ITECOMPRAS.CODIGO 
INNER JOIN COMPRAS
ON ITECOMPRAS.NOTA=COMPRAS.NOTA
INNER JOIN ITEVENDAS
ON ESTOQUE.CODIGO = ITEVENDAS.CODIGO
WHERE COMPRAS.MODELO='01'
AND ITEVENDAS.MODELO='01'
GROUP BY ESTOQUE.CODIGO,
         ESTOQUE.NOME,
         COMPRAS.MODELO,
        ITEVENDAS.MODELO
ORDER BY ESTOQUE.CODIGO,
         ESTOQUE.NOME,
         COMPRAS.MODELO,
         ITEVENDAS.MODELO

Acredito q o motivo pelo qual retorna dados errado é que no segundo vc inclui o ITEVENDAS.CODIGO e no primeiro o ESTOQUE.CODIGO isso, logicamente, faz agrupamentos de dados diferentes e por isso os resultados são diferentes.


Marisiana, Ocorreu a mesma coisa que aconteceu quando fiz a junção dos condigo, a forma foi diferente, mas
a logica foi a mesma, olha o que aconteceu tanto no meu codigo quanto o seu.
Exemplo: Dei uma entrada de nota do Produto A de 50 quantidades e fiz uma venda do mesmo de 2. Depois outra
entrada de mais 30 produtos A no estoque, automaticamente ele duplica o total de venda para 4, ou seja, sempre
que dou uma entrada, o valor da venda sempre duplica...Outra coisa que acontece tambem, so vai aparecer no meu
relatorio se pelo menos tiver uma compra ou uma venda para o mesmo produto, se tiver so uma compra ou so uma
venda, ele nao aparece.
Obrigado a todos !!
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

Eu acho que está faltando incluir algum JOIN nesse SQL... Talvez tenha que utilizar a tabela VENDAS ...
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

Imagino que algumas dessas tabelas referencie PRODUTO ou então tenha mais alguma chave que faz ligação com a tabela de estoque...
GOSTEI 0
David Sylvestre

David Sylvestre

21/10/2014

Os dois selects não possuem o mesmo numero de colunas.
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Os dois selects não possuem o mesmo numero de colunas.

Nao entendi muito bem o que vc quis dizer, teria como tu explicar
como seria essas quantidade de colunas...Obriagado!!!
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Imagino que algumas dessas tabelas referencie PRODUTO ou então tenha mais alguma chave que faz ligação com a tabela de estoque...

Tambem estou achando que seja algo relacionado a isso, so que nao
consegui vê qual seria essa ligação Marisiana.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

No primeiro select vc utilizou os campos
ESTOQUE.CODIGO,
ESTOQUE.NOME,
SUM(ITECOMPRAS.QTD) AS COMPRAS,
COMPRAS.MODELO

no segundo select
 ITEVENDAS.CODIGO,
SUM(ITEVENDAS.QTD) QTD_VENDA,
ESTOQUE.NOME

O retorno do SQL varia conforme as colunas que vc inclui, tabelas que vc referencia e das junções que vc faz entres elas e da ordem do agrupamento (GROUP BY)

Você tem que observar que está fazendo dois selects com uma regra que não está tão igual assim.
No exemplo que te passei uni os dois selects para obter um resultado mais correto possível. Agora vc tem q verificar qual é a regra que esse select tem q atender, se são necessários incluir aqueles filtros na cláusula WHERE, de quais campos e quais tabelas você terá que vincular para buscar as informações corretas.
GOSTEI 0
David Sylvestre

David Sylvestre

21/10/2014

Nao entendi muito bem o que vc quis dizer, teria como tu explicar
como seria essas quantidade de colunas...Obriagado!!!


"Para utilizar o UNION, o número e a ordem das colunas precisam ser idênticos em todas as queries e os data types precisam ser compatíveis."
Read more: http://www.linhadecodigo.com.br/artigo/945/sql-utilizando-o-operador-union-e-union-all.aspx#ixzz3GsdPytPg
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

As informações se detalham conforme as colunas que vc inclui no select e conforme o agrupamento que você define.
Se vc incluir apenas
SUM(ITECOMPRAS.QTD) AS COMPRAS,
SUM(ITEVENDAS.QTD) QTD_VENDA,

As informações serão totalizadas respeitando o foi definido na clausula WHERE.
Se você incluir
ESTOQUE.CODIGO,
ESTOQUE.NOME,
SUM(ITECOMPRAS.QTD) AS COMPRAS,
SUM(ITEVENDAS.QTD) QTD_VENDA

você está pedindo que some os itens de compra e venda por NOME e por CÓDIGO, dessa forma, você terá que incluir esses dois campos no GROUP BY para que o cálculo seja realizado.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

Tiago, conseguiu alterar o SQL?
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Tiago, conseguiu alterar o SQL?

Marisiana, Tentei fazer o codigo sem usar o UNION, fazendo
os vínculos tudo dentro da WHERE, mas tambem nao deu certo. To
baixando alguns materiais para dar mais um estudada sobre isso
para vê se consigo resolver.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

Você já tinha utilizado o padrão ANSI ? ( inner join, left join, right join)
GOSTEI 0
Tiago Rodrigues

Tiago Rodrigues

21/10/2014

Você já tinha utilizado o padrão ANSI ? ( inner join, left join, right join)

Nao. Vou começar trabalhar com eles agora, paguei um material aqui pra
vê se consigo fazer a junção.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/10/2014

Certo!
Esses dois artigos podem te auxiliar:
Oracle Database: Entendendo o conceito de Join e Outer Join

[url:descricao=Cláusulas INNER JOIN, LEFT JOIN e RIGHT JOIN - Associação de Tabelas: SQL Server 2008 - Parte]https://www.devmedia.com.br/clausulas-inner-join-left-join-e-right-join-associacao-de-tabelas-sql-server-2008-parte-2/18930[/url]
GOSTEI 0
POSTAR