Browse the best-selling product

1

I'm having difficulty joining two tables and using some aggregate function, I've tried it like this:

SELECT nome FROM produto
INNER JOIN vendaproduto SUM(quantidade)
ON produto.idproduto = vendaproduto.idproduto

But it is giving error ...

    
asked by anonymous 12.06.2018 / 02:42

1 answer

2

Translating the Produto and venda_Produto tables from your template to PgSQL :

CREATE TABLE Produto
(
    idproduto INTEGER NOT NULL,
    nome VARCHAR(60) NOT NULL,
    PRIMARY KEY ( idproduto )
);

CREATE TABLE venda_Produto
(
    idvenda INTEGER NOT NULL,
    idproduto INTEGER NOT NULL,
    quantidade INTEGER NOT NULL,
    PRIMARY KEY ( idvenda, idproduto ),
    FOREIGN KEY (idproduto) REFERENCES Produto (idproduto)
);

Registering Products:

INSERT INTO Produto ( idproduto, nome ) VALUES ( 100, 'Prego' );
INSERT INTO Produto ( idproduto, nome ) VALUES ( 200, 'Parafuso' );
INSERT INTO Produto ( idproduto, nome ) VALUES ( 300, 'Chave de Fenda' );

Registering Sales:

INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 1, 100, 1 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 2, 100, 4 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 3, 100, 1 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 4, 200, 3 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 5, 200, 1 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 6, 200, 3 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 7, 300, 5 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 8, 300, 5 );

To determine which best-selling product you have, you can combine the SUM() aggregation function with the ORDER BY and LIMIT clauses, see:

SELECT
  idproduto,
  sum(quantidade) AS qtd_total
FROM
  venda_Produto
GROUP BY
  idproduto
ORDER BY
  qtd_total DESC
LIMIT
  1;

Output:

| idproduto | qtd_total |
|-----------|-----------|
|       300 |        10 |

Now, including JOIN with the Produtos table:

SELECT
  vp.idproduto,
  p.nome,
  sum(vp.quantidade) AS qtd_total
FROM
  venda_Produto AS vp
JOIN
  Produto AS p ON ( p.idproduto = vp.idproduto )
GROUP BY
  vp.idproduto,
  p.nome
ORDER BY
  qtd_total DESC
LIMIT
  1;

Output:

| idproduto |           nome | qtd_total |
|-----------|----------------|-----------|
|       300 | Chave de Fenda |        10 |

SQLFiddle

    
12.06.2018 / 09:01