I want to make an insert where the sales_value column (of the sales table) is automatically populated which will be the value (contained in the products table) * the quantity (this in the sales table).
Does anyone know how to do this?
I want to make an insert where the sales_value column (of the sales table) is automatically populated which will be the value (contained in the products table) * the quantity (this in the sales table).
Does anyone know how to do this?
Assuming your structure and data are something like:
CREATE TABLE tb_vendas
(
id SERIAL,
id_produto INTEGER,
valor_venda REAL,
quantidade INTEGER
);
CREATE TABLE tb_produto
(
id INTEGER,
nome TEXT,
valor_unitario REAL
);
-- PRODUTOS CADASTRADOS
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 1, 'CANETA', 1.50 );
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 2, 'LAPIS', 0.55 );
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 3, 'GRAMPEADOR', 14.50 );
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 4, 'CADERNO', 4.75 );
You can "register" your vendas
this way:
-- VENDEU 3 CADERNOS
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 3, p.valor_unitario * 3 FROM tb_produto AS p WHERE p.id = 4);
-- VENDEU 2 GRAMPEADORES
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 2, p.valor_unitario * 2 FROM tb_produto AS p WHERE p.id = 3);
-- VENDEU 10 LAPIS
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 10, p.valor_unitario * 10 FROM tb_produto AS p WHERE p.id = 2);
-- VENDEU 7 CANETAS
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 7, p.valor_unitario * 7 FROM tb_produto AS p WHERE p.id = 1);
Checking vendas
:
SELECT
v.id,
p.nome,
p.valor_unitario,
v.quantidade,
v.valor_venda
FROM
tb_vendas AS v
JOIN
tb_produto AS p ON ( p.id = v.id_produto );
Output:
| id | nome | valor_unitario | quantidade | valor_venda |
|----|------------|----------------|------------|-------------|
| 24 | CANETA | 1.5 | 7 | 10.5 |
| 23 | LAPIS | 0.55 | 10 | 5.5 |
| 22 | GRAMPEADOR | 14.5 | 2 | 29 |
| 21 | CADERNO | 4.75 | 3 | 14.25 |
See working in SQL Fiddle
Another workaround is to implement a FUNCTION
able to register a venda
from the id
of produto
and quantidade
sold:
CREATE OR REPLACE FUNCTION fc_registrar_venda( INTEGER, INTEGER )
RETURNS INTEGER AS
$$
BEGIN
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, $2, p.valor_unitario * $2 FROM tb_produto AS p WHERE p.id = $1);
RETURN currval( pg_get_serial_sequence('tb_vendas','id') );
END;
$$
LANGUAGE plpgsql;
Registering vendas
with FUNCTION
:
-- COMPROU 3 CADERNOS
SELECT fc_registrar_venda( 4, 3 );
-- COMPROU 2 GRAMPEADORES
SELECT fc_registrar_venda( 3, 2 );
-- COMPROU 10 LAPIS
SELECT fc_registrar_venda( 2, 10 );
-- COMPROU 7 CANETAS
SELECT fc_registrar_venda( 1, 7 );
See working on SQL Fiddle
With Sub Select:
INSERT INTO VENDAS (produto,quantidade,valor_venda) values
(::produto,::quantidade,((select valor_unitario from produtos where codigo = ::produto)*::quantidade));
where ::produto
is the product code that you enter in the sale,
and ::quantidade
is the amount you will enter in the sale.