SQL-запрос для топ-10 продаваемых ску по брендам в Volusion
Возиться с этим запросом для магазина Volusion, пытаясь получить самые продаваемые sku по марке.... и я так и сделал, но как я могу показать только топ-10 брендов PER....
Если я добавлю 10 лучших, это всего лишь 10 строк.
select
products_joined.ProductManufacturer as brand,
Sum(OrderDetails.ProductPrice * OrderDetails.Quantity) AS TotalSold,
OrderDetails.ProductCode as sku
from
orderdetails, orders, products_joined
where
products_joined.ProductCode = OrderDetails.ProductCode
and Orders.OrderID = OrderDetails.OrderID
and Orders.OrderDate BETWEEN getdate() - 90 AND getdate()
and Orders.OrderStatus <> 'Cancelled'
and products_joined.ProductManufacturer is not null
group by
products_joined.ProductManufacturer, OrderDetails.ProductCode
order by
products_joined.ProductManufacturer,
Sum(OrderDetails.ProductPrice*OrderDetails.Quantity) DESC
2 ответа
Решение
Если доступен ROW_NUMBER, вы также можете использовать CTE и делать что-то подобное.
;WITH cteProductsSold AS (
SELECT pj.ProductManufacturer AS brand,
od.ProductCode AS sku,
SUM(od.ProductPrice * od.Quantity) AS TotalSold
FROM orders o
INNER JOIN orderdetails od ON od.OrderID = o.OrderID
INNER JOIN products_joined pj ON pj.ProductCode = od.ProductCode
WHERE o.OrderDate BETWEEN GETDATE() - 90 AND GETDATE()
AND o.OrderStatus <> 'Cancelled'
AND pj.ProductManufacturer IS NOT NULL
GROUP BY pj.ProductManufacturer,
od.ProductCode
), cteProductOrdered AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY brand ORDER BY TotalSold DESC) Rn
FROM cteProductsSold
)
SELECT brand,
sku,
TotalSold
FROM cteProductOrdered
WHERE Rn < 11
В качестве альтернативы вы можете использовать производные таблицы вместо CTE.
SELECT brand,
sku,
TotalSold
FROM ( SELECT *,
ROW_NUMBER() OVER (PARTITION BY brand ORDER BY TotalSold DESC) Rn
FROM ( SELECT pj.ProductManufacturer AS brand,
od.ProductCode AS sku,
SUM(od.ProductPrice * od.Quantity) AS TotalSold
FROM orders o
INNER JOIN orderdetails od ON od.OrderID = o.OrderID
INNER JOIN products_joined pj ON pj.ProductCode = od.ProductCode
WHERE o.OrderDate BETWEEN GETDATE() - 90 AND GETDATE()
AND o.OrderStatus <> 'Cancelled'
AND pj.ProductManufacturer IS NOT NULL
GROUP BY pj.ProductManufacturer,
od.ProductCode
) p
) ps
WHERE Rn < 11
Это должно работать тоже
select * from (
select
products_joined.ProductManufacturer as brand,
Sum(OrderDetails.ProductPrice*OrderDetails.Quantity) AS TotalSold,
OrderDetails.ProductCode as sku,
row_number() over ( partition by products_joined.ProductManufacturer, OrderDetails.ProductCode order by Sum(OrderDetails.ProductPrice*OrderDetails.Quantity) desc) rowid
from orderdetails, orders, products_joined
where
products_joined.ProductCode = OrderDetails.ProductCode and
Orders.OrderID = OrderDetails.OrderID and
Orders.OrderDate BETWEEN getdate() - 90 AND getdate()
AND Orders.OrderStatus <> 'Cancelled' and products_joined.ProductManufacturer is not null
GROUP BY products_joined.ProductManufacturer, OrderDetails.ProductCode
) as x
where rowid < 11
ORDER BY brand,TotalSold DESC