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

Откуда:
Сообщений: 204
Здравствуйте!
Есть у меня таблица «Products», в которой находятся одновременно и категории, и товары в глубокой иерархии,
однако каждое наименование обладает идентификатором "TopCategoryId".
Теперь мне надо написать запрос, чтобы вывести все заказы по топ категориям и количеству,
используя связанный по первичному ключу «ProductId» с таблицей «Orders», например так:

TopCategory Quantity
Овощи 41
Рыба 23
Бакалея 34

Подскажите правильную идею или схему написания такого запроса, можно псевдокодом или ссылку, сам склоняюсь к написанию через рекурсивное СТЕ.
11 сен 13, 16:44    [14827327]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Glory
Member

Откуда:
Сообщений: 104751
GROUP BY TopCategoryId
11 сен 13, 16:47    [14827342]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
Спасибо, Glory, вы всегда помогаете.
Здесь есть маленький нюанс,
TopCategoryId наименование находится уровнем выше,
в сущности TopCategoryId = ProductId, но имеет в поле TopCategoryId = 0
11 сен 13, 17:02    [14827465]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Glory
Member

Откуда:
Сообщений: 104751
inner join (select TopCategoryId, TopCategoryName from Products where TopCategoryId = 0) b on ...
11 сен 13, 17:06    [14827511]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
Не получается.

Для наглядности таблица "Products" такая:

ProductId TopCategoryId Title
1 0 Овощи
2 0 Фрукты
3 0 Рыба
4 0 Бакалея
5 1 Помидоры
6 2 Апельсины
7 3 Треска
8 4 Соль морская
9 4 Соль мелкая
10 4 Соль крупная

Таблица "Orders":

OrderId ProductId
1 5
2 6
3 7
4 8
11 сен 13, 18:04    [14827890]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
asdor
Member

Откуда: Москва
Сообщений: 509
Судя по тому что вы привели, как раз это:
Glory
GROUP BY TopCategoryId
11 сен 13, 18:29    [14827996]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
если
Torre
одновременно и категории, и товары в глубокой иерархии

имеет всего два уровня, т можно простой join
select p1.Title , count(*) from Orders o
join Products p on p.productid = o.productid
join Products p1 on p1.productid = p.TopCategoryId
group by p1.Title 


иначе только рекурсивное CTE, чтобы для каждого productId определить TopCategory
12 сен 13, 08:17    [14829188]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
Доброе утро! Всем спасибо за помощь, это бесценно. Обращаю внимание, что подлинную структуру привести не могу, поэтому рассуждаю только по классической аналогии «Orders -> Products». Условие задачи: получить количество приобретенных товаров по топ категории, например «Овощи | 20», Уровней вложенности иерархий 9. Решить задачу простым группированием пока не удается, вот этот запрос правильно выводит список топ категорий, но мне еще надо получить общее количество по каждой топ категории:
SELECT ProductId, ProductName FROM Products WHERE ProductId IN 
(SELECT Products.ParentId INNER JOIN Products ON Products.ProductId = Orders.ProductId GROUP BY Products.ParentId)
HandKot, сейчас проверю вашу идею.
12 сен 13, 10:19    [14829563]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Glory
Member

Откуда:
Сообщений: 104751
Torre
вот этот запрос правильно выводит список топ категорий, но мне еще надо получить общее количество по каждой топ категории:
SELECT ProductId, ProductName FROM Products WHERE ProductId IN 
(SELECT Products.ParentId INNER JOIN Products ON Products.ProductId = Orders.ProductId GROUP BY Products.ParentId)

Список топкатегорий получается так
SELECT * FROM Products WHERE TopCategoryId = 0
12 сен 13, 10:23    [14829597]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
Glory
Список топкатегорий получается так
Имею ввиду, что правильно выводит список категорий имеющихся orders
12 сен 13, 10:39    [14829712]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Glory
Member

Откуда:
Сообщений: 104751
Torre
Glory
Список топкатегорий получается так
Имею ввиду, что правильно выводит список категорий имеющихся orders

Еще интереснее
И зачем в подзапоросе еще раз используется Products ?
Ее мало в основном запросе ?
12 сен 13, 10:44    [14829753]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
В подзапросе выбираются TopCategoryId (опечатка ParentId) по которым выбираются уже названия категорий.
12 сен 13, 10:50    [14829807]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Glory
Member

Откуда:
Сообщений: 104751
Torre
В подзапросе выбираются TopCategoryId (опечатка ParentId) по которым выбираются уже названия категорий.

Те примеры данных, которые вы приводите здесь, не требуют многократного обращения к одним и тем же таблицам
Если у вас в реальности другие данные/структуры, то привидите их. Или прекращайте пудрить мозги
12 сен 13, 10:53    [14829826]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
Помогите написать тогда с рекурсивным СТЕ. Вот этот запрос выводит правильный список TopCategoryId:
 
SELECT Products.TopCategoryId INNER JOIN Products ON Products.ProductId = Orders.ProductId GROUP BY Products.TopCategoryId 

Как теперь правильно написать рекурсию?
12 сен 13, 10:54    [14829838]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
Glory
Те примеры данных, которые вы приводите здесь, не требуют многократного обращения к одним и тем же таблицам
Если у вас в реальности другие данные/структуры, то привидите их. Или прекращайте пудрить мозги
Не могу, Glory, в реальности деталей больше и структура сложнее, но я пока сфокусировался на основе, которая такова в обычном понимании отношений Orders -> Products. Мне не надо писать запрос, мне достаточно правильной схемы, спасибо вам, вы всегда помогаете, давайте уже оставим запрос-подзапрос, вижу, так просто не сделать, давайте через рекурсию, по крайней мере это будет надежно.
12 сен 13, 10:58    [14829880]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Torre
Вот этот запрос выводит правильный список TopCategoryId:
 
SELECT Products.TopCategoryId INNER JOIN Products ON Products.ProductId = Orders.ProductId GROUP BY Products.TopCategoryId 

Этот запрос не может ничего выводить, т.к. он синтаксически неверен — например, в нём нет FROM.
12 сен 13, 10:59    [14829890]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Glory
Member

Откуда:
Сообщений: 104751
Удивляюсь с людей, которые не могут даже скопипастить готовое решение
declare @products table(ProductId int, TopCategoryId int, Title nvarchar(50))

insert @products
select 1,	0,	N'Овощи'
union all
select 2,	0,	N'Фрукты'
union all
select 3,	0,	N'Рыба'
union all
select 4,	0,	N'Бакалея'
union all
select 5,	1,	N'Помидоры'
union all
select 6,	2,	N'Апельсины'
union all
select 7,	3,	N'Треска'
union all
select 8,	4,	N'Соль морская'
union all
select 9,	4,	N'Соль мелкая'
union all
select 10,	4,	N'Соль крупная'

declare @orders table (OrderId int,	ProductId int)

insert @orders
select 1,	5
union all
select 2,	6
union all
select 3,	7
union all
select 4,	7
union all
select 4,	8

select p1.Title , count(*) from @orders o
join @products p on p.productid = o.productid
join @products p1 on p1.productid = p.TopCategoryId
group by p1.Title 
12 сен 13, 11:04    [14829938]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Glory
Member

Откуда:
Сообщений: 104751
Torre
Glory
Те примеры данных, которые вы приводите здесь, не требуют многократного обращения к одним и тем же таблицам
Если у вас в реальности другие данные/структуры, то привидите их. Или прекращайте пудрить мозги
Не могу, Glory, в реальности деталей больше и структура сложнее, но я пока сфокусировался на основе, которая такова в обычном понимании отношений Orders -> Products. Мне не надо писать запрос, мне достаточно правильной схемы, спасибо вам, вы всегда помогаете, давайте уже оставим запрос-подзапрос, вижу, так просто не сделать, давайте через рекурсию, по крайней мере это будет надежно.

Ага, раз я не понимаю простого запроса, то давайте сложный. Фейспалм
12 сен 13, 11:04    [14829946]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
Спасибо, Glory! Результат верный, прости, что отнял много времени, мне еще t-sql постигать и постигать, благодарю тебя. Сейчас пытаюсь осмыслить этот join.
12 сен 13, 11:13    [14830005]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите, как написать запрос кол-во товаров по категориям  [new]
Torre
Member

Откуда:
Сообщений: 204
HandKot
если
Torre
одновременно и категории, и товары в глубокой иерархии

имеет всего два уровня, т можно простой join
select p1.Title , count(*) from Orders o
join Products p on p.productid = o.productid
join Products p1 on p1.productid = p.TopCategoryId
group by p1.Title 

HandKot, вам тоже спасибо, этот запрос верный, как выяснилось в итоге, простите сразу не проверил.
12 сен 13, 11:22    [14830083]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить