Это не проблема начинающих. Это обычное дело, но и у одного человека пот довольно трудно получить право. И они часто прибегают к нескольким операторам SQL.
Но вам, друг мой, повезло! Вы собираетесь пойти со мной в мир аналитических функций. Но будьте уверены - есть другие способы справиться с этим, если это не по вашему вкусу.
Я предполагаю, что вы просто возитесь с SQL и достаточно хотите узнать больше. Если вы на самом деле пытаетесь решить конкретную проблему, это поможет, если вы можете быть более конкретным в этих двух пунктах:
- Что вы хотите, чтобы ваш результат был похож? Ожидаете ли вы 12 рядов, с колонками «Месяц», «Лучший продавец», «Нижний продавец»? 24 строки в одном результирующем наборе? Являются ли два набора результатов ОК?
- Действительно ли «проданы наименее» включают продукты, которые ничего не продавали? (Т.е., они donn't появляются в таблице Order Details за месяц на всех.)
В SQL:
WITH
ProductSalesPerMonth AS
(
SELECT
DATEPART(MM, O.OrderDate) AS MonthNum,
OD.ProductID,
SUM(OD.Quantity) AS Quantity
FROM
Orders O
JOIN [Order Details] OD
ON O.OrderID = OD.OrderID
WHERE
O.OrderDate BETWEEN '19970101' AND '19971231'
GROUP BY
DATEPART(MM, O.OrderDate),
OD.ProductID
),
RankedProductSalesPerMonth AS
(
SELECT
PSPM.*,
ROW_NUMBER() OVER (PARTITION BY PSPM.MonthNum ORDER BY PSPM.Quantity ASC) AS Rank_SoldLeast,
ROW_NUMBER() OVER (PARTITION BY PSPM.MonthNum ORDER BY PSPM.Quantity DESC) AS Rank_SoldMost
FROM
ProductSalesPerMonth PSPM
)
SELECT
PS.MonthNum,
P.ProductName,
PS.Quantity,
CASE
WHEN Rank_SoldMost = 1 THEN 'Top Seller'
WHEN Rank_SoldLeast = 1 THEN 'Bottom Seller'
ELSE 'Only Seller'
END AS SalesRank
FROM
RankedProductSalesPerMonth PS
JOIN Products P
ON P.ProductID = PS.ProductID
WHERE
(Rank_SoldMost = 1 OR Rank_SoldLeast = 1)
ORDER BY
MonthNum ASC,
Quantity DESC
;
Выход:
MonthNum ProductName Quantity SalesRank
1 Geitost 119 Top Seller
1 Konbu 2 Bottom Seller
2 Pâté chinois 180 Top Seller
2 Gorgonzola Telino 3 Bottom Seller
3 Raclette Courdavault 162 Top Seller
3 Konbu 1 Bottom Seller
Может быть, вы видя это и говоря «Jeezuz!», так вот краткое объяснение кода.
WITH позволяет вам создать подзапрос, называемый «Common Table Expression». В SQL Server он должен работать как вид. CTE могут ссылаться друг на друга. Я использую их, потому что считаю, что легче понять отдельные компоненты, чем один большой SELECT, где вы ссылаетесь на DATEPART(MM, O.OrderDate)
и SUM(OD.Quantity)
везде. Это также позволяет нам связывать столы (например, Product
), пока нам не понадобится эта информация.
В нашей первой статье мы собираем и суммируем в месяц по каждому продукту. Это все.
Второе предложение определяет продавцов верхнего и нижнего уровня. В SQL Server общий способ найти одну запись из группы - разбивать и сортировать так, чтобы запись, которую вы хотите, попала в верхнюю часть ранжированного списка. Сортируя по количеству DESC, наш главный продавец получит «1» в столбце Ranked_SoldMost. Аналогично для нижнего продавца.
Третье предложение позволяет нам фильтровать до наших продавцов верхнего и нижнего уровня, а затем украшать ProductID информацией о продукте.
И все. Если это не то, о чем вы просили, или у вас есть вопросы, уходите.
И какой у вас код или какая часть вы застряли? – HLGEM
Это то, что у меня есть - Но я не могу просмотреть максимальный и минимальный за каждый месяц. . Выберите p.productname, Datepart (MM, o.OrderDate), od.Quantity из заказов o внутреннее соединение [Детали заказа] od on o.OrderID = od.OrderID внутреннее соединение Продукты p на p.ProductID = od.ProductID Где YEAR (o.OrderDate) = 1997 Группа по дате (MM, o.OrderDate), od.Quantity, p. productname – Abey
Abey, вы должны включить информацию в свой последний комментарий в исходный вопрос. Я пошел вперед и сделал это за вас. У вас будет больше удачи в SO, если вы предоставите структуру любых ссылочных таблиц. Я (и большинство людей) знаю, что такое база данных Northwind, но у меня нет запомненной схемы, и я не собираюсь ее искать ... Помогите нам помочь вам. –