Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Select запрос. База Northwind. Задача / 10 сообщений из 10, страница 1 из 1
20.01.2021, 00:03
    #40037294
NIK2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
Добрый день!
Просьба помочь с запросом.
Для каждого покупателя (имя, фамилия) показать название его любимого товара в каждой категории. Любимый товар – это тот, которого покупатель купил больше всего штук (столбец Quantity).
Т.е необходимо решить, чтобы 1столбец-Покупатель, 2 столбец-категория, 3 столбец любимый продукт

Хочу решить с помощью Cross Applay

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Select C.Contactname, Ca.Categoryname, P.Productname
from customers C
Cross Apply (
Select  Top(1) with ties P.Productname,Ca.Categoryname
from categories Ca
inner join Products P On Ca.CategoryID=P.CategoryID
inner join [Order Details] OD On P.ProductID=OD.ProductID
inner join Orders O On OD.OrderID=O.OrderID
Where O.customerID=C.customerID
Group by P.Productname,Ca.Categoryname
Order by sum(OD.Quantity) Desc) D



Выдает ошибку. Где я ошибаюсь?
Заранее спасибо за помощь.
...
Рейтинг: 0 / 0
20.01.2021, 07:03
    #40037320
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
На сколько я вижу у вас неправильно выставлены алиасы
"Select C.Contactname, Ca.Categoryname, P.Productname" замените на "Select C.Contactname, D.Categoryname, D.Productname"
...
Рейтинг: 0 / 0
20.01.2021, 13:34
    #40037438
NIK2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
Grim08, Добрый день!
Спасибо
Еще одна просьба.
Как сделать запрос так, что сохранились все покупатели(Contactname) и категории (Categoryname) ?

Я изменил cross Apply на outer Apply, и первый джоин во второй на табличке с inner на left, остальное убрал в скобки. Покупатели все остаются, но все равно категории теряются, если покупатель ничего не покупал в ней. Хотелось бы сделать так чтобы, если покупатель ничего в ней не покупал она отображалась, а в товаре (D.Productname) был null

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Select C.Contactname, D.Categoryname, D.Productname
from customers C
Outer Apply (
Select Top(1) with ties P.Productname,Ca.Categoryname
from categories Ca
left join( Products P 
inner join [Order Details] OD On P.ProductID=OD.ProductID
inner join Orders O On OD.OrderID=O.OrderID )
On Ca.CategoryID=P.CategoryID
Where O.customerID=C.customerID
Group by P.Productname,Ca.Categoryname
Order by sum(OD.Quantity) Desc) D
Order by C.Contactname
...
Рейтинг: 0 / 0
20.01.2021, 13:43
    #40037450
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
Модератор: NIK2019, используйте тег SRC для оформления кода
...
Рейтинг: 0 / 0
20.01.2021, 18:05
    #40037564
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
Сейчас нет времени писать запрос целиком, скажу проблема в том что у вас есть условие
Код: sql
1.
Where O.customerID=C.customerID


которое и не дает вам соединить категории которые ни кто не покупал так как там O.customerID = NULL
Вам сначала нужно сделать CROSS JOIN клиентов и категории товаров потом посчитать количество продаж и оставить то что нужно.
...
Рейтинг: 0 / 0
22.01.2021, 21:26
    #40038179
NIK2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
Grim08, Т.е изначально я делаю табличку
Код: sql
1.
2.
3.
4.
Select C.Contactname, Categoryname
from Customers C CROSS JOIN
(Select *
From Categories B  ) D


Она соединяет Покупателей и категории.

Далее создаю табличку самых покупаемых товаров.
Код: sql
1.
2.
3.
4.
5.
6.
Select  Top(1) with Ties Productname
from Products P
inner join [Order Details] OD on P.ProductID=OD.ProductID
inner join Orders O On OD.OrderID=O.OrderID
group by Productname
Order by sum(OD.Quantity) Desc



А как их потом между собой соединить?
...
Рейтинг: 0 / 0
23.01.2021, 14:42
    #40038275
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
NIK2019, вроде так должны получить то, что вы хотите

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT Cu.Contactname, Ca.Categoryname, P.Productname
FROM Customers AS Cu
CROSS JOIN Categories AS Ca
OUTER APPLY (SELECT TOP(1) WITH TIES P.Productname
		     FROM Products AS P
			 JOIN [Order Details] AS OD ON P.ProductID = OD.ProductID
			 JOIN Orders AS O ON OD.OrderID = O.OrderID
			 WHERE P.CategoryID = Ca.CategoryID
				   AND Cu.CustomersID = O.CustomersID
			 GROUP BY P.Productname
			 ORDER BY SUM(OD.Quantity) DESC) AS P
...
Рейтинг: 0 / 0
25.01.2021, 14:35
    #40038690
NIK2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
Grim08, Добрый день!
не проходит, выдает ошибку
Код: sql
1.
2.
3.
4.
Сообщение 207, уровень 16, состояние 1, строка 9
Недопустимое имя столбца "CustomersID".
Сообщение 207, уровень 16, состояние 1, строка 9
Недопустимое имя столбца "CustomersID".


Проблема здесь
Код: sql
1.
AND Cu.CustomersID = O.CustomersID


наверное
...
Рейтинг: 0 / 0
26.01.2021, 19:49
    #40039111
Grim08
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
NIK2019,
Ну посмотрите код, вроде не сложно, опечатка в названии Customer s Id -> CustomerId
...
Рейтинг: 0 / 0
27.01.2021, 14:30
    #40039359
NIK2019
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select запрос. База Northwind. Задача
Grim08,
Заработало, Спасибо большое
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Select запрос. База Northwind. Задача / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]