Select best sellers in related table

1

I have a table pedidos , produtos and other produtos_em_pedidos described as follows:

produtos: id | nome
pedidos: id | data
produtos_em_pedidos: produto_id | pedido_id | quantidade

I need to select the products that most occur in the orders, and can filter by date.

One example I've already found is finding the best-selling products globally, without considering the quantity column, via the query:

select produto_id, count(produto_id) from produtos_em_pedidos group by produto_id order by count(produto_id) desc

Now how would I filter this by the date that is in the pedidos table (ex: WHERE data > 2015-01-01 ) and how would I still multiply the count by the quantidade column?

EDIT: I was able to filter by dates using the following query:

SELECT produto_id, count(produto_id) FROM produtos_em_pedidos
WHERE pedido_id in (select id from pedidos where data > '2015-01-01')
AND pedido_id in (select id from pedidos where data < '2018-01-01')
GROUP BY produto_id
order by count(produto_id) DESC;
    
asked by anonymous 15.03.2017 / 14:43

1 answer

0
  

Now how would I filter this by the date that is in the Orders table (eg WHERE date > 2015-01-01)?

To do this, simply join it with the table that has the date and check the condition in the where clause as follows:

select produto_id, count(produto_id) as num_produto from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01' group by produto_id;
  

and how would you still multiply the count by the quantity column?

In this case, you will not only be able to get a query because the query will require the aggregation of the quantity column to group by . To get the information you need, a subquery is required for each aggregate function. To retrieve the quantity of products first, the following query can be used:

select produto_id, count(produto_id) as num_produto from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01' group by produto_id

To obtain the quantity of requests, the following query can be used:

select sum(quantidade) as total, produto_id from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01'  group by produto_id

Putting both together you will get the information you want. The final query would look like this:

select vendas.produto_id, num_produto * total from (select produto_id, count(produto_id) as num_produto from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01' group by produto_id) vendas join (select sum(quantidade) as total, produto_id from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01'  group by produto_id) quantidades using (produto_id) order by num_produto desc;

Here are some tests that I ran to evaluate the elaborated query:

    
15.03.2017 / 16:11