2015-12-09 3 views
1

Я изучаю функции окна в 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 

Почему это так? Как я могу это исправить?

+1

Использование 'JOIN', а не подзапросов и потому, что' BuyOrderDetail' и 'SalesOrderDetail' не связаны, вы эффективно выполняете декартовое соединение между этими двумя таблицами. Сделав это, вы не добьетесь хороших результатов. –

+0

Короче говоря, хотя исходный запрос может быть улучшен, я не думаю, что его улучшение будет использовать функции окна; Если ваша основная цель - изучать их, я бы начал с другого запроса. –

ответ

1

Вы должны изменить INNER JOINLEFT JOIN к

Потому что, когда вы внутреннее соединение, результат будет не хватать ProductID, который из ProductInventory таблицы не имеет PurchaseOrderDetail или SalesOrderDetail.

+0

Спасибо. Результат второго запроса дает мне очень большие числа (намного больше фактического). Кроме того, он всегда дает мне «TotalSales == TotalPurchases» –

Смежные вопросы