Как найти товар с максимальным количеством заказа в каждом регионе? - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно найти товар с максимальным количеством заказа в каждом регионе.Результат должен быть таким:

|RegionID | ProductID |

Вот база данных:

enter image description here

PS ссылка на резервную копию базы данных: https://drive.google.com/open?id=15iE53xxni9C7uGaaa-kcK4b6WnmQv_1f

Это мой код, я пытался, но он рассчитывает только для одного региона.Мне нужно рассчитать динамически для всех регионов.

SELECT TOP 1 T.RegionID, T.ProductID, MAX(T.Quantity) AS MaxOrders
FROM(
    SELECT Region.RegionID, [Order Details].ProductID, SUM([Order Details].Quantity) AS Quantity
    FROM Region
    JOIN Territories ON Region.RegionID = Territories.RegionID
    JOIN EmployeeTerritories ON Territories.TerritoryID = EmployeeTerritories.TerritoryID
    JOIN Employees ON EmployeeTerritories.EmployeeID = Employees.EmployeeID
    JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID
    JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID
    GROUP BY Region.RegionID, [Order Details].ProductID
) T
WHERE T.RegionID = 1
GROUP BY T.RegionID, T.ProductID
ORDER BY MaxOrders DESC

Ответы [ 4 ]

0 голосов
/ 11 апреля 2019

Вы можете использовать оконные функции в запросе агрегации. Это выглядит так:

SELECT RegionID, ProductID, Quantity AS MaxOrders
FROM (SELECT t.RegionID, od.ProductID, 
             SUM(od.Quantity) AS Quantity,
             ROW_NUMBER() OVER (PARTITION BY t.RegionID ORDER BY SUM(od.Quantity) DESC) as seqnum
      FROM Territories t JOIN
           EmployeeTerritories et
           ON t.TerritoryID = et.TerritoryID JOIN
           Employees e
           ON et.EmployeeID = e.EmployeeID JOIN
           Orders o
           ON e.EmployeeID = o.EmployeeID JOIN
           [Order Details] od
           ON o.OrderID = od.OrderID
      GROUP BY t.RegionID, od.ProductID
     ) t
WHERE seqnum = 1
ORDER BY MaxOrders DESC;

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Таблица Region не нужна, поскольку необходимый столбец находится в Territories.
  • Во внешнем запросе агрегирование не требуется, только фильтрация.
0 голосов
/ 11 апреля 2019

join Таблица регионов снова ваш запрос.

select * 
from  Region
left join(
SELECT   T.RegionID, T.ProductID, MAX(T.Quantity) AS MaxOrders
FROM(
    SELECT Region.RegionID, [Order Details].ProductID, SUM([Order Details].Quantity) AS Quantity
    FROM Region
    JOIN Territories ON Region.RegionID = Territories.RegionID
    JOIN EmployeeTerritories ON Territories.TerritoryID = EmployeeTerritories.TerritoryID
    JOIN Employees ON EmployeeTerritories.EmployeeID = Employees.EmployeeID
    JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID
    JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID
    GROUP BY Region.RegionID, [Order Details].ProductID
) T
--WHERE T.RegionID = 1
GROUP BY T.RegionID, T.ProductID
 ) A on A.RegionID =  Region.RegionID
0 голосов
/ 11 апреля 2019

Крестная заявка должна помочь в этом.

Select R.RegionId, C.ProductId, C.MaxOrders From Region R
CROSS APPLY (
    SELECT TOP 1 T.RegionID, T.ProductID, MAX(T.Quantity) AS MaxOrders
    FROM(
      SELECT Region.RegionID, [Order Details].ProductID, SUM([Order 
      Details].Quantity) AS 
     Quantity
    FROM Region
    JOIN Territories ON Region.RegionID = Territories.RegionID
    JOIN EmployeeTerritories ON Territories.TerritoryID = 
  EmployeeTerritories.TerritoryID
   JOIN Employees ON EmployeeTerritories.EmployeeID = Employees.EmployeeID
   JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID
   JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID
   GROUP BY Region.RegionID, [Order Details].ProductID
 ) T
WHERE T.RegionID = R.RegionId
GROUP BY T.RegionID, T.ProductID
ORDER BY MaxOrders DESC ) C
0 голосов
/ 11 апреля 2019

Вы можете использовать раздел для достижения этого, я присоединился к необходимой таблице в соответствии с вашей диаграммой.

        SELECT REGIONID,PRODUCTID
        FROM(SELECT *,Row_number() over(partition by REGIONID order by Total desc) rn
        FROM(Select T.REGIONID,OD.PRODUCTID,COUNT(OD.PRODUCTID) as Total
        From Orders O
        LEFT JOIN EmployeeTerritories ET
        on O.EmployeeID=ET.EmployeeID
        LEFT JOIN Territories T
        on T.TerritoryID=ET.TerritoryID
        LEFT JOIN OrderDetails OD
        on OD.OrderID=O.OrderID
        GROUP BY T.REGIONID,OD.PRODUCTID)a)b
    WHERE b.rn=1

Поскольку вам нужен альтернативный вариант без раздела, у вас может быть подзапрос, чтобы `получить максимальную сумму продаж продукта для каждого региона, и использовать его для присоединения, чтобы получить максимальный объем продаж продукта для региона.

SELECT a.RegionID,a.PRODUCTID
(Select T.REGIONID,OD.PRODUCTID,COUNT(OD.PRODUCTID) as Total
    From Orders O
    LEFT JOIN EmployeeTerritories ET
    on O.EmployeeID=ET.EmployeeID
    LEFT JOIN Territories T
    on T.TerritoryID=ET.TerritoryID
    LEFT JOIN OrderDetails OD
    on OD.OrderID=O.OrderID
    GROUP BY T.REGIONID,OD.PRODUCTID)a
INNER JOIN
(Select RegionID,max(Total) as MaXTotal
FROM(Select T.REGIONID,OD.PRODUCTID,COUNT(OD.PRODUCTID) as Total
    From Orders O
    LEFT JOIN EmployeeTerritories ET
    on O.EmployeeID=ET.EmployeeID
    LEFT JOIN Territories T
    on T.TerritoryID=ET.TerritoryID
    LEFT JOIN OrderDetails OD
    on OD.OrderID=O.OrderID
    GROUP BY T.REGIONID,OD.PRODUCTID)b
GROUP BY RegionID)c
on c.RegionID=a.RegionID and a.Total=c.MaxTotal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...