这适用于电子商务网站。目前,当客户点击某个类别时,应用程序将找到此类别产品的最高价格和最低价格,将差额除以5(仅需5个价格范围),然后根据定义的价格范围对产品进行分组。
问题是当90%的产品价格在50美元左右,但很少有产品在3000美元左右,那么大多数产品将分组在第一个范围内,后续范围只显示少量产品。这将破坏价格范围的目的。
理想情况是,应用程序显示价格根据产品种群而定,如:
但每个价格范围的最小值和最大值因类别而异。
可以在1商店程序(SQL Express 2008)中完成吗?有什么想法吗?
先谢谢。
答案 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种产品。
等等。
答案 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