Я изучаю функции окна в sql-сервере. Я использую базу данных AdventrueWorks2012 для практики. Я хочу рассчитать общее количество продаж и покупок для каждого товара в магазине.select count over partition by
Классическое решение может быть как
SELECT ProductID,
Quantity,
(SELECT Count(*)
FROM AdventureWorks.Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetail.ProductID = p.ProductID) TotalPurchases,
(SELECT Count(*)
FROM AdventureWorks.Sales.SalesOrderDetail
WHERE SalesOrderDetail.ProductID = p.ProductID) TotalSales
FROM (SELECT DISTINCT ProductID,
Quantity
FROM AdventureWorks.Production.ProductInventory) p
Попытка преобразовать оконные функции дает мне неправильные результаты:
SELECT DISTINCT d.ProductID,
Quantity,
Count(d.ProductID)
OVER(
PARTITION BY d.ProductID) TotalPurchases,
Count(d2.ProductID)
OVER(
PARTITION BY d2.ProductID) TotalSales
FROM (SELECT DISTINCT ProductID,
Quantity
FROM AdventureWorks.Production.ProductInventory) p
INNER JOIN AdventureWorks.Purchasing.PurchaseOrderDetail d
ON p.ProductID = d.ProductID
INNER JOIN AdventureWorks.Sales.SalesOrderDetail d2
ON p.ProductID = d2.ProductID
ORDER BY d.ProductID
Почему это так? Как я могу это исправить?
Использование 'JOIN', а не подзапросов и потому, что' BuyOrderDetail' и 'SalesOrderDetail' не связаны, вы эффективно выполняете декартовое соединение между этими двумя таблицами. Сделав это, вы не добьетесь хороших результатов. –
Короче говоря, хотя исходный запрос может быть улучшен, я не думаю, что его улучшение будет использовать функции окна; Если ваша основная цель - изучать их, я бы начал с другого запроса. –