SQL畅销书查询
我在每一个类别中都找不到畅销书。随附代码,我只能找到所需书籍的类别,但如何找到这本书SQL畅销书查询,sql,postgresql,Sql,Postgresql,我在每一个类别中都找不到畅销书。随附代码,我只能找到所需书籍的类别,但如何找到这本书 SELECT b.category_id, max(b.total_quantity) as max_quantity FROM ( SELECT books.id, books.category_id, sum(order_items.quantity) as total_quantity FROM order_items INNER JOIN orders
SELECT b.category_id, max(b.total_quantity) as max_quantity
FROM (
SELECT books.id, books.category_id, sum(order_items.quantity) as total_quantity
FROM order_items
INNER JOIN orders ON order_items.order_id = orders.id
INNER JOIN books on order_items.book_id = books.id
WHERE orders.status in (2, 3)
GROUP BY books.id
) as b
GROUP BY b.category_id
我猜您的图书表中一定有图书名称列。因此,您可以尝试以下查询-
SELECT b.book_name, b.category_id, max(b.total_quantity) as max_quantity
FROM (
SELECT books.id, books.book_name, books.category_id, sum(order_items.quantity) as total_quantity
FROM order_items
INNER JOIN orders ON order_items.order_id = orders.id
INNER JOIN books on order_items.book_id = books.id
WHERE orders.status in (2, 3)
GROUP BY books.id
) as b
GROUP BY b.category_id
您可以在
having
子句中使用相关的聚合查询进行筛选,该查询返回相关类别的最畅销数量:
select b.id, b.category_id, sum(oi.quantity) as total_quantity
from order_items oi
inner join orders o on oi.order_id = o.id and o.status in (2, 3)
inner join books b on oi.book_id = b.id
having sum(oi.quantity) = (
select sum(oi.quantity)
from order_items oi1
inner join orders o1 on oi1.order_id = o1.id and o1.status in (2, 3)
inner join books b1 on oi1.book_id = b1.id
where b1.category_id = b.category_id
group by b1.id
order by sum(oi.quantity) desc
limit 1
)
group by b.id, b.category_id
或者,如果您的RDBMS支持窗口函数(并允许将它们与聚合混合使用):
我会在总和上使用密秩。 如果在RDBMS中可用
SELECT *
FROM
(
SELECT books.id, books.category_id
, SUM(orditm.quantity) AS total_quantity
, DENSE_RANK() OVER (PARTITION BY books.category_id ORDER BY SUM(order_items.quantity) DESC) AS Rnk
FROM order_items AS orditm
JOIN orders ON orditm.order_id = orders.id
JOIN books ON orditm.book_id = books.id
WHERE orders.status IN (2, 3)
GROUP BY books.id, books.category_id
) q
WHERE Rnk = 1
在上使用不同的
:
SELECT DISTINCT ON (b.id), b.*, SUM(oi.quantity) as total_quantity
FROM order_items oi JOIN
orders o
ON oi.order_id = o.id JOIN
books b
ON oi.book_id = b.id
WHERE o.status in (2, 3)
GROUP BY b.id
ORDER BY b.category_id, total_quantity DESC
您可以将此查询的结果加入product表。请使用您正在使用的RDBMS标记您的问题:mysql、oracle、sql server。。。?
SELECT DISTINCT ON (b.id), b.*, SUM(oi.quantity) as total_quantity
FROM order_items oi JOIN
orders o
ON oi.order_id = o.id JOIN
books b
ON oi.book_id = b.id
WHERE o.status in (2, 3)
GROUP BY b.id
ORDER BY b.category_id, total_quantity DESC