Consulta SQL

5 respostas
cgomesnet

Olá Pessoal, td bem com vocês?

Seguinte, eu tenho 3 tabelas em um banco de dados com os seguintes atributos:
Tab1 (MesAno, CodUnid, CodProd, Valor)
Tab2(MesAno, CodUnid, CodProd, Quantidade)
Tab3(MesAno, CodUnid, CodProd, Quantidade)

Legenda:
CodUnid = Código da Unidade
CodProd = Código do Produto

Meu objetivo aqui é fazer uma consulta que me retorne o produto da multiplicação entre (Tab1.Valor * Tab2.Quantidade * Tab3.Quantidade), mas estou com dificuldades pois as 3 tabelas nem sempre coincidem os registros por exemplo, ela pode estar preenchida da seguinte forma:

Tab1 Tab2 Tab3
1 * 1 * 1
2 * - * 2

        • 3

O resultado exibido pela consulta deveria ser (considerando que irei tratar zero para ser 1 quando 1 das 3 tiver zero como no exemplo):

Consulta
1
4
3

Como vocês puderam ver, os dados estão aleatório e não há nenhum relacionamento entre as 3 tabelas. Eu já pesquisei UNION, Left Join, Right Join, mas nada surtiu o resultado que eu preciso, com base nesse exemplo vocês conseguiram entender minha dúvida?

5 Respostas

darkroger

opa, se é multiplicacao, entao vc pode armazernar o numero “1” nos campos onde nao tem nada(1 na multiplicacao nao vai alterar o valor), tipo nao deixe que os campos fiquem vazios, quando for armazenar vazio coloque 1 ao inves de deixar vazio.

falow

O

Não entendi 100% a sua dúvida, mas se o seu problema é que um dado retorna NULL, veja se o seu banco de dados implementa a função NVL.

pinto

Aí vai uma sugestão (não testada…):

Use FULL OUTER JOIN, para obter as linhas que não tenham correspondência em alguma das tabelas.
Use COALESCE para obter MesAno, CodUnid e CodProd, pois você não sabe em qual tabela encontrará estas informações.
Use COALESCE para substituir por 1 o valor nulo retornado para as colunas das tabelas sem correspondência.

Ficaria assim:

SELECT COALESCE(T1.MESANO, T2.MESANO, T3.MESANO) AS DATA,
COALESCE(T1.CODUNID, T2.CODUNID, T3.CODUNID) AS UNID,
COALESCE(T1.CODPROD, T2.CODPROD, T3.CODPROD) AS PROD
(COALESCE(T1.VALOR, 1) * COALESCE(T2.QUANTIDADE, 1) * COALESCE(T3.QUANTIDADE, 1)) AS VALOR
FROM TAB1 T1
FULL OUTER JOIN TAB2 T2
ON T1.MESANO = T2.MESANO AND
T1.CODUNID = T2.CODUNID AND
T1.CODPROD = T2.CODPROD
FULL OUTER JOIN TAB3 T3
ON T1.MESANO = T3.MESANO AND
T1.CODUNID = T3.CODUNID AND
T1.CODPROD = T3.CODPROD
WHERE DATA = X AND
UNID = Y AND
PROD = Z

Obs. 1: Não levei em consideração a utilidade prática desta consulta (não vejo muito sentido em, por exemplo, multiplicar quantidade por quantidade)

Obs. 2: Sei que ficou complicado, e talvez não seja esse o caminho, mas a intenção foi ajudar…

cgomesnet

Olá amigos

Obrigado pelas dicas, estou considerando cada uma na tentativa de solucionar o meu problema e com certeza postarei aqui a resposta quando for solucionao (se for).

Bom, eu obviamente estou tentando decompor o problema em partes para solucioná-lo e estou com problemas nessa sintaxe que infelizmente não está compilando, alguém pode me ajudar?

SELECT (TblVenda.Valor * TblTransferencia.Quantidade * TblRecebimento.Quantidade) AS Ponderacao
FROM TblVenda 
LEFT JOIN (TblTransferencia ON (TblTransferencia.MesAno = TblVenda.MesAno) AND (TblTransferencia.CodUnidade = TblVenda.CodUnidade) AND (TblTransferencia.CodCConsumo = TblVenda.CodCConsumo))
LEFT JOIN (TblRecebimento ON (TblRecebimento.MesAno = TblVenda.MesAno) AND (TblTRecebimento.CodUnidade = TblVenda.CodUNidade) AND (TblRecebimento.CodCConsumo = TblVenda.CodCConsumo))
WHERE TblUnidade.CodUnidade = 2 AND TblData.MesAno = 01/2008 AND TblContasEstoque.CodCConsumo = 010101

O erro retornado é… “Erro de sintaxe na operação JOIN”

B

o parenteses não tá no local errado?

SELECT (TblVenda.Valor * TblTransferencia.Quantidade * TblRecebimento.Quantidade) AS Ponderacao FROM TblVenda LEFT JOIN TblTransferencia ON ((TblTransferencia.MesAno = TblVenda.MesAno) AND (TblTransferencia.CodUnidade = TblVenda.CodUnidade) AND (TblTransferencia.CodCConsumo = TblVenda.CodCConsumo)) LEFT JOIN TblRecebimento ON ((TblRecebimento.MesAno = TblVenda.MesAno) AND (TblTRecebimento.CodUnidade = TblVenda.CodUNidade) AND (TblRecebimento.CodCConsumo = TblVenda.CodCConsumo)) WHERE TblUnidade.CodUnidade = 2 AND TblData.MesAno = 01/2008 AND TblContasEstoque.CodCConsumo = 010101

Criado 14 de maio de 2008
Ultima resposta 15 de mai. de 2008
Respostas 5
Participantes 5