2015-08-31 3 views
-1

У меня есть 2 стола: Items и Categories. Каждый элемент относится к категории.Сортировка в пределах группы

Таблица товаров

║ Item_name ║ Category_id ║ Price ║ 

║ A   ║ Cat_1 ║ 100 ║ 

║ B   ║ Cat_1 ║ 50 ║ 

║ C   ║ Cat_2 ║ 98 ║ 

║ D   ║ Cat_2 ║ 99 ║ 

║ E   ║ Cat_1 ║ 40 ║ 

Таблица Категории

║ Category_id ║ Category_name ║ 

║ Cat_1  ║ X    ║ 

║ Cat_2  ║ Y    ║ 

Я хочу, чтобы сортировать все пункты в пределах категории по цене. Как я могу это сделать? Ожидаемые результаты:

║ Item_name ║ Category ║ Price ║ 

║ E   ║ Cat_1 ║ 40 ║ 

║ B   ║ Cat_1 ║ 50 ║ 

║ A   ║ Cat_1 ║ 100 ║ 

║ C   ║ Cat_2 ║ 98 ║ 

║ D   ║ Cat_2 ║ 99 ║ 

ответ

1

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

SELECT i.Item_Name, i.Category_ID, i.Price 
    FROM items i 
    ORDER BY i.Category_ID, i.price; 

Но если вы хотите включить название категории, простое соединение будет выполнено.

SELECT i.Item_Name, i.Category_ID, c.Category_Name, i.Price 
    FROM items i 
     INNER JOIN categories c 
      ON i.Category_ID = c.Category_ID 
    ORDER BY i.Category_ID, i.price; 

EDIT Основываясь на вопрос в комментарии, как вернуть 50 дешевые пункты в каждой категории для SQL Server. Вы можете использовать общее табличное выражение (CTE) и использовать функцию ROW_NUMBER для подсчета позиций в каждой категории по цене.

WITH cteOrderByCategory AS (
    SELECT i.item_name, i.Category_ID, i.price, 
      ROW_NUMBER() OVER(PARTITION BY i.Category_ID ORDER BY i.price) AS RowNum 
     FROM items i 
) 
SELECT obc.item_name, obc.Category_ID, obc.price 
    FROM cteOrderByCategory obc 
    WHERE obc.RowNum <= 50 
    ORDER BY obc.Category_ID, obc.price; 
+0

Спасибо Джо! Если бы я хотел получить только самые дешевые 50 предметов в каждой категории, как бы я мог разместить это ограничение? – Akshay

+0

@Akshay: Какие СУБД вы используете (например, MySQL, SQL Server)? –

+0

Я использую SQL-сервер. Благодаря! – Akshay

1

Нет необходимости в группе, вам нужно всего лишь заказать:

select 
    i.Item_Name, 
    c.Category_name, 
    i.Price 
from items i 
    inner join Categories c on i.category_id = c.category_id 
order by c.category_id, i.price 
+0

Спасибо, Дейв! – Akshay

Смежные вопросы