T-sql:如何根据类别动态创建价格范围?

时间:2010-12-15 08:19:48

标签: tsql grouping

这适用于电子商务网站。目前,当客户点击某个类别时,应用程序将找到此类别产品的最高价格和最低价格,将差额除以5(仅需5个价格范围),然后根据定义的价格范围对产品进行分组。

问题是当90%的产品价格在50美元左右,但很少有产品在3000美元左右,那么大多数产品将分组在第一个范围内,后续范围只显示少量产品。这将破坏价格范围的目的。

理想情况是,应用程序显示价格根据产品种群而定,如:

  • 第一价格范围内的前10%产品
  • 第二个价格范围内的后续25%
  • 第三个价格范围内的后续25%
  • 第四个价格范围内的后续25%
  • 第五价格范围内的最后15%

但每个价格范围的最小值和最大值因类别而异。

可以在1商店程序(SQL Express 2008)中完成吗?有什么想法吗?

先谢谢。

3 个答案:

答案 0 :(得分:1)

混合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)

答案 1 :(得分:0)

一种解决方案是动态生成价格范围。这就是你如何做到的:

假设您有100种产品。

  • 按升序对所有产品进行排序。
  • 第一价格范围内的10%产品 - 挑选前10个产品。价格范围=第1 - 第10产品。
  • 第二个价格区间的后续25% - 选择下一个25个产品。价格范围11-35产品。
  • 第三个价格区间的25% - 选择下一个25个产品。价格范围36th - 60th Product。

等等。

答案 2 :(得分:0)

您可以使用ntile窗口功能根据需要将产品分组到价格范围内。一种方法是根据价格将产品分成20个桶(每桶5%)。然后桶1-2将是第一个10%,3-7接下来是25%,依此类推。

请参阅下面的基于AVDW数据库产品表的示例SQL

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