Найдите идентификатор продукта самого продаваемого продукта каждого дня, используя общее количество проданных товаров, чтобы определить наиболее продаваемый продукт - PullRequest
0 голосов
/ 24 июня 2018

База данных Adventureworks2008R2 Я хочу получать результат каждый день, когда MaxQantity продается, например, OrderDate 2007-09-01 будет иметь максимальное количество только 96, но мой запрос дает мне 3 разных результата за один и тот же день, возможно, потому что онтакже рассматривает метку времени

SELECT DISTINCT CAST(oh.OrderDate AS DATE) OrderDate, (od.ProductID),SUM(od.OrderQty) MAXOrderQty
FROM Sales.SalesOrderDetail od
Inner Join Sales.SalesOrderHeader oh
ON od.SalesOrderID = oh.SalesOrderID
GROUP BY od.ProductID, CAST(oh.OrderDate AS DATE), od.OrderQty
ORDER BY SUM(od.OrderQty) DESC 

Screenshot of my output

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Вы можете написать CTE и self JOIN на MAX Кол-во date

;WITH CTE(OrderDate,ProductID,MAXOrderQty) AS(
    SELECT  CAST(oh.OrderDate AS DATE) OrderDate,od.ProductID,SUM(od.OrderQty) MAXOrderQty
    FROM Sales.SalesOrderDetail od
    Inner Join Sales.SalesOrderHeader oh
    ON od.SalesOrderID = oh.SalesOrderID
    GROUP BY od.ProductID, CAST(oh.OrderDate AS DATE)
)
SELECT t1.* 
FROM CTE t1 INNER JOIN (
    select OrderDate,MAX(MAXOrderQty) 'MAXOrderQty'
    from CTE 
    GROUP BY OrderDate
)t2 on t1.OrderDate = t2.OrderDate and t1.MAXOrderQty = t2.MAXOrderQty
0 голосов
/ 24 июня 2018

Решать подобные проблемы намного проще с помощью оконных функций. В этом случае rank должен сделать трюк:

SELECT OrderDate, ProductID, MaxOrderQty
FROM   (SELECT OrderDate, ProductID, MaxOrderQty,
               RANK() OVER (PARTITION BY OrderDate ORDER BY MaxOrderQty DESC) AS rk
        FROM   Sales.SalesOrderDetail) s
WHERE  rk = 1
...