Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Задачка из учебной БД Northwind  [new]
ZForman
Member

Откуда:
Сообщений: 7
Помогите разобраться с задачей.
Есть БД Northwind (Та, что учебная от MS)
Картинка с другого сайта.
--Мне нужно для каждого товара (вывести имя товара) показать два города, в которые его больше всего заказали.
Я пробывал пойти таким путем:
1. Посчитать общее кол-во товаров
2. Товары разложить по городам
3. Вывести список товаров. Хотел соеденить через OUTER APPLY, так как для одного списка вывожу другой список

SELECT ShipCity, COUNT(*)
FROM (SELECT ShipCity,
(SELECT COUNT(Quantity)
FROM [Order Details]
WHERE OrderID=Orders.OrderID) A
FROM Orders) AS MyTable
GROUP BY ShipCity
ORDER BY COUNT(*) DESC

А дальше запутался.

К сообщению приложен файл. Размер - 37Kb
29 ноя 15, 11:47    [18487438]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
ZForman,
Например.
Выбираете все записи из товаров, а уже к рим кросс аплаем подзапрос с убывающей сортировкой по количеству заказов в городе этого товара.
Но это не самый быстрый запрос получится
29 ноя 15, 12:51    [18487526]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
ZForman
Member

Откуда:
Сообщений: 7
Несколько часов проломал голову, так и не смог решить. Задачу решаю для себя, поэтому важен алгоритм решения. Только учу БД.
29 ноя 15, 19:07    [18488470]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
ZForman
Member

Откуда:
Сообщений: 7
Тут посчитал, в какой город, было отправлено всего товаров.
SELECT ShipCity,
(
SELECT SUM(Quantity)
FROM [Order Details] OD
WHERE OrderID=O.OrderID
) AS A
FROM Orders O
29 ноя 15, 19:12    [18488490]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Если будет одинаковое количество одного товаров отправленное в четыре города, что тогда?

А если один товар в город А отправлен 6 раз, в город Б 5 раз и больше никуда. Какой долежн быть вывод? (только один город или два города)
29 ноя 15, 19:17    [18488507]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
ZForman
Member

Откуда:
Сообщений: 7
Выход примерно такой.
Список Товаров|В такой то город|Столько то штук.

т.е. получается нужно два списка. Первый список товаров, второй список - городов.

*Если будет одинаковое количество одного товаров отправленное в четыре города, что тогда?* - тогда будет 4 в результате, тут планировал использовать TOP(2) WITH TIES

*А если один товар в город А отправлен 6 раз, в город Б 5 раз и больше никуда. Какой долежен быть вывод? (только один город или два города)* - два города

К сообщению приложен файл. Размер - 5Kb
29 ноя 15, 19:32    [18488549]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
Rankatan
Member

Откуда:
Сообщений: 250
SELECT P.ProductName, ShipCity, cnt FROM
(
	SELECT  OD.ProductID, O.ShipCity, SUM(Quantity) cnt,
	DENSE_RANK() OVER( PARTITION BY OD.ProductID ORDER BY SUM(Quantity) DESC) ord
	FROM [Order Details] OD
	INNER JOIN [Orders] O
	ON OD.OrderID=O.OrderID
	GROUP BY OD.ProductID,O.ShipCity
) Z
JOIN dbo.Products P 
	ON z.ProductID=P.ProductID
WHERE Z.ord IN (1,2)
29 ноя 15, 19:48    [18488596]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
ZForman
Member

Откуда:
Сообщений: 7
Мне подсказали. Но я хотел решить обычными под запросами и cross apply. Это слишком сложно для меня.

SELECT TOP 1 WITH TIES OD.ProductID, O.ShipCity
FROM [Order Details] OD
INNER JOIN [Orders] O
ON OD.OrderID=O.OrderID
GROUP BY OD.ProductID,O.ShipCity
ORDER BY IIF(DENSE_RANK() OVER( PARTITION BY OD.ProductID ORDER BY COUNT(*) desc,ShipCity asc) <=2,0,1)
29 ноя 15, 19:49    [18488599]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
ZForman
Member

Откуда:
Сообщений: 7
Всем спасибо за внимание и решение. Пойду учить дальше, некоторый синтаксис для меня нов.
29 ноя 15, 19:53    [18488613]     Ответить | Цитировать Сообщить модератору
 Re: Задачка из учебной БД Northwind  [new]
ZForman
Member

Откуда:
Сообщений: 7
Еще одна задачка из этой категории. Предыдущую хотел решить похожим синтаксисом.

Показать два самых дорогих товара в каждой категории.

SELECT CategoryName, ProductName
FROM Categories C CROSS APPLY
(
SELECT TOP 2 ProductName
FROM Products
WHERE CategoryID=C.CategoryID
ORDER BY UnitPrice DESC
)G
29 ноя 15, 20:09    [18488673]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить