SQL - insert that receives calculated values from other columns of other tables

0

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?

    
asked by anonymous 07.11.2017 / 13:32

2 answers

1

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

    
08.11.2017 / 16:11
0

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.

    
07.11.2017 / 13:56