T-sql: Как динамически создать ценовой диапазон в зависимости от категории? - PullRequest
1 голос
/ 15 декабря 2010

Это для сайта электронной коммерции. В настоящее время, когда клиент нажимает на категорию, приложение находит максимальную цену и минимальную цену для продуктов в этой категории, делит разницу на 5 (требуется только 5 диапазонов цен), а затем группирует продукты в соответствии с определенными диапазонами цен.

Проблема в том, что если 90% товаров стоят около 50 долларов, а немногие товары стоят около 3000 долларов, тогда большинство товаров будут сгруппированы в первом диапазоне, а в последующих диапазонах будет отображаться только несколько товаров. Это победит цель наличия ценовых диапазонов.

В идеальном случае цена приложения отображается в зависимости от количества продуктов, например:

  • Первые 10% товаров в 1-м ценовом диапазоне
  • Последующие 25% во втором ценовом диапазоне
  • Последующие 25% в 3-м ценовом диапазоне
  • Последующие 25% в 4-м ценовом диапазоне
  • Последние 15% в пятом ценовом диапазоне

, но минимальное и максимальное значение каждого ценового диапазона зависит от категории.

Можно ли это сделать в процедуре 1 хранилища (SQL Express 2008)? Есть идеи?

Спасибо заранее.

Ответы [ 3 ]

1 голос
/ 15 декабря 2010

Смешивание TOP PERCENT и ранее найденные диапазоны приведут к пяти ценовым диапазонам.

Оператор SQL

DECLARE @p1 INTEGER
DECLARE @p2 INTEGER
DECLARE @p3 INTEGER
DECLARE @p4 INTEGER
DECLARE @p5 INTEGER
DECLARE @p6 INTEGER
DECLARE @p7 INTEGER
DECLARE @p8 INTEGER
DECLARE @p9 INTEGER
DECLARE @p10 INTEGER


/* Price category 1 */
SELECT  @p1 = MIN(Price), @p2 = MAX(Price) FROM (SELECT TOP 10 PERCENT Price FROM @Products ORDER BY Price) c

/* Price category 2 */
SELECT  @p3 = MIN(Price), @p4 = MAX(Price) FROM (SELECT TOP 25 PERCENT Price FROM @Products WHERE Price > @p2 ORDER BY Price) c                  

/* Price category 3 */
SELECT  @p5 = MIN(Price), @p6 = MAX(Price) FROM (SELECT TOP 25 PERCENT Price FROM @Products WHERE Price > @p4 ORDER BY Price) c                  

/* Price category 4 */
SELECT  @p7 = MIN(Price), @p8 = MAX(Price) FROM (SELECT TOP 25 PERCENT Price FROM @Products WHERE Price > @p6 ORDER BY Price) c                          

/* Price category 5 */
SELECT  @p9 = MIN(Price), @p10 = MAX(Price) FROM @Products WHERE Price > @p8

SELECT 'Category 1', [Low] = @p1, [High] = @p2
UNION ALL SELECT 'Category 2', @p3, @p4
UNION ALL SELECT 'Category 3',  @p5, @p6
UNION ALL SELECT 'Category 4',  @p7, @p8
UNION ALL SELECT 'Category 5',  @p9, @p10

Данные испытаний

DECLARE @Products TABLE (Price INTEGER)

INSERT INTO @Products 
          SELECT (50)
UNION ALL SELECT (51)
UNION ALL SELECT (52)
UNION ALL SELECT (53)
UNION ALL SELECT (54)
UNION ALL SELECT (55)
UNION ALL SELECT (56)
UNION ALL SELECT (57)
UNION ALL SELECT (58)
UNION ALL SELECT (59)
UNION ALL SELECT (60)
0 голосов
/ 15 декабря 2010

Вы можете использовать оконную функцию ntile, чтобы при необходимости сгруппировать продукт в ценовые диапазоны. Один из подходов состоит в том, чтобы разбить продукты на 20 сегментов в зависимости от цены (каждый сегмент с 5%). Тогда тогда ведра 1-2 будут первыми 10%, 3-7 следующими 25% и так далее.

См. Ниже пример SQL на основе таблицы продуктов базы данных AVDW

select englishproductname,listprice,
 case  
 when nt between 1 and 2 then 1
 when nt between 3 and 7 then 2
 when nt between 8 and 12 then 3
 when nt between 13 and 17 then 4
 when nt between 18 and 20 then 5
  end as range
  from(
select englishproductname,listprice,
  ntile(20) over(order by listprice) as nt
from dbo.dimproduct) as prd
0 голосов
/ 15 декабря 2010

Одним из решений является динамическое создание ценовых диапазонов. Вот как вы можете это сделать:

Допустим, у вас есть 100 продуктов.

  • Сортировка всех товаров по возрастанию.
  • 10% товаров в первом ценовом диапазоне - Выберите 10 лучших товаров. Ценовой диапазон = 1-10 продукт.
  • Последующие 25% во втором ценовом диапазоне - Выберите следующие 25 продуктов. Ценовой диапазон 11-й - 35-й продукт.
  • Последующие 25% в 3-м ценовом диапазоне - Выберите следующие 25 продуктов. Ценовой диапазон 36-й - 60-й товар.

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...