Unir 3 tabelas

PostgreSQL

Delphi

05/05/2016

Pessoal,

Tenho 3 tabelas e gostaria de unir elas para mostrar em um Grid e depois imprimir um relatório.

(vou simplificar)
1º Tabela Cliente:
- id
- nome

2º Tabela Entrada:
- idCliente
- idProduto
- data
- quantidade_entrada
- valorUnitario

3º Tabela Saída:
- id_cliente
- id_produto
- data
- quantidade_saida
- valorUnitario

Explicando: Isso é um controle de estoque, o cliente compra uma quantia de tal produto X isso é uma entrada e
ao decorrer ele vai gastando este produto, então gera uma saída.

Quero mostrar no grid quando ele fez uma entrada e quando ele fez uma saída, a linha de entrada terá uma cor verde
e a linha de saida terá uma cor vermelha.

Quero q o grid fique assim:
1 registro:
Nome Cliente: Taltal
Produto: Botão
Data: 05/05/2016
Quantidade: 5000
Valor UNitario: R$4,50
COR VERDE (Entrada)


2 registro:
Nome Cliente: Taltal
Produto: Botão
Data: 06/05/2016
Quantidade: 2000
Valor Unitario: R$4,50
COR VERMELHA (SAIDA)


Tentei utilizar Union, mas gostaria de pegar o nome do cliente. Alguma sugestão??

SELECT
	E.data, E.quantidade, E."valorUnitario", E."valorTotal"
FROM
	Entrada AS e
WHERE 
     	E."idCliente" = 1 and E."idProduto" = 1
UNION ALL    	
SELECT
	S.data,
	S.quantidade,
	S."valorUnitario",
	S."valorTotal"
from 
	Saida S
WHERE 
     	S."idCliente" = 1 and S."idProduto" = 1
Leonardo Couy

Leonardo Couy

Curtidas 1

Respostas

Joel Rodrigues

Joel Rodrigues

05/05/2016

Ola. Para isso, faça um inner join com a tabela de clientes.
GOSTEI 0
Leonardo Couy

Leonardo Couy

05/05/2016

Olá Joel!! Obrigado pela resposta. Eu tentei pelo inner join, porém ele concatena as linhas da tabela entrada e saida.

por exemplo, eu quero que fique assim:

id - nome_cliente - quantidade - p_unitario

e usando inner join fica assim:

id - nome_cliente - quantidade_entrada - p_unitario_entrada - quantidade_saida - p_unitario_saida


Estou pensando em criar 1 tabela com os mesmos dados da entrada e saída, e colocar um campo char chamado "Tipo" e quando for Entrada, eu coloco E e quando for Saída coloco S. Creio que será mais fácil de manipular.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

05/05/2016

Como você tem duas consultas unidas, deve fazer o inner join em cada uma delas separadamente e depois uni-mas. Ou seja, você vai fazer o join das entradas com clientes e depois das saídas com clientes. Em cada consulta você deve incluir o nome do cliente, para que seja possível fazer a união.

Para o tipo de registro, nao precisa de uma nova tabela, basta adicionar esse campo na consulta, por exemplo:
..., 'E' as Tipo
na entrada e
..., 'S' as Tipo
na saída.
GOSTEI 0
Douglas Santos

Douglas Santos

05/05/2016

Olá amigo vc so vai conseguir realizar essa consulta usando o Inner join, left join, ou right join

Exemplo de uso

SELECT C.*, E.*, S.* FROM cliente C INNER JOIN entrada E ON c.idCliente = e.idCliente INNER JOIN saida S ON c.idCliente = s.idCliente

Se acaso existir uma categoria de entrada e saída com referência no cliente você usa o GROUP BY c.idCliente, e se precisar usar uma condição vc usar o HAVING que funciona da mesma forma que cláusula WHERE

Se acaso vc tenha campos com o mesmo nome em ambas as tabelas alem do campos de referência, vc precisa fazer com o SQL nomeie esse campos com outro nome exemplo

Tabela 1
Produto
Quantidade
Valor unitario

Tabela 2
Produto
Quantidade
Valor unitario

Repare que em ambas as tabelas possuem os mesmos campos, então vc precisa nomea-los com nome distintos para que não acha confusão ao ler ambos os dados.

Vc pode nomea-los diretamente no Banco de dados ou use a cláusula AS para nomea-la sem altera-la fisicamente exemplo

Nomeando os nomes dos campos da tabela entrada.

SELECT E.produto AS eProduto, E.quantidade AS eQts, E.valorUnitario AS eValorUnitario,

Nomeando os nomes dos campos da tabela saída

S.produto AS sProduto, S.quantidade AS sQts, S.valorUnitario AS sValorUnitario


Você não precisa nomear ambas as tabelas , basta apenas nomear os campos de uma e pronto, voce usa no loop os campos nomeados e os campos da outra tabela que não foram nomeados.

Espero que tenha te ajudado
GOSTEI 0
POSTAR