自动为物品申请最合适的折扣套餐

时间:2010-09-01 18:55:11

标签: sql sql-server-2008 stored-procedures logic

我创建了一些折扣套餐:

Package1(Item1,Item2,Item5) Discount-5%.
Package2(Item2,Item5,Item8) Discount-8% 
Package3(Item1,Item2) Discount3%.

当一个人在线购买物品时(例如,他购买了Item1,Item2,Item5,Item10),当我向他显示总价时,我需要自动对物品应用最合适的折扣。

在上述情况下,两个折扣适用于所述选择,但 Package1折扣最好,因为它给予最大利益 ...所以我需要自动应用这个。

是否有人遇到过这种情况或有人能帮助我?

DiscountID DiscountName ItemIds Disc%

1 Package1 1,2,5 5
2 Package2 2,3,5 8
3 Package3 1,2 3

我有所有ItemId和我一起选择了一个人。现在需要申请最合适的折扣..

感谢您的帮助/指导。

3 个答案:

答案 0 :(得分:1)

试试这个

-- Test tables
CREATE TABLE #Package(Name varchar(50), Discount decimal(10,2))
CREATE TABLE #PackageItem(PackageName varchar(50), ProductName varchar(50))
CREATE TABLE #ShoppingCart(ProductName varchar(50))

-- Test data
INSERT INTO #Package VALUES ('Package1', 0.05)
INSERT INTO #PackageItem VALUES ('Package1', 'Item1')
INSERT INTO #PackageItem VALUES ('Package1', 'Item2')
INSERT INTO #PackageItem VALUES ('Package1', 'Item5')
INSERT INTO #Package VALUES ('Package2', 0.08)
INSERT INTO #PackageItem VALUES ('Package2', 'Item1')
INSERT INTO #PackageItem VALUES ('Package2', 'Item5')
INSERT INTO #PackageItem VALUES ('Package2', 'Item8')
INSERT INTO #Package VALUES ('Package3', 0.03)
INSERT INTO #PackageItem VALUES ('Package3', 'Item1')
INSERT INTO #PackageItem VALUES ('Package3', 'Item2')

INSERT INTO #ShoppingCart VALUES ('Item1')
INSERT INTO #ShoppingCart VALUES ('Item2')
INSERT INTO #ShoppingCart VALUES ('Item5')
INSERT INTO #ShoppingCart VALUES ('Item10')

SELECT  TOP 1 *
FROM    (
    -- Join #ShoppingCart with PackageItem and count matched rows
    SELECT      #Package.Name, #Package.Discount,
                COUNT(#Package.Name) AS [Count]
    FROM        #ShoppingCart
    LEFT JOIN   #PackageItem 
                ON #PackageItem.ProductName = #ShoppingCart.ProductName
    LEFT JOIN   #Package ON #Package.Name = #PackageItem.PackageName
    GROUP BY    #Package.Name, #Package.Discount
        ) A
JOIN
        (
    -- Count how many products each package have
    SELECT      #Package.Name,
                COUNT(#Package.Name) AS [Count]
    FROM        #Package
    LEFT JOIN   #PackageItem ON #Package.Name = #PackageItem.PackageName
    GROUP BY    #Package.Name, #Package.Discount
        ) B
-- if same package contains same number of products, pick it
-- (so you can't have a same item twice in your cart;
--  but you probably already have a quantity column)
ON A.Name = B.Name AND A.[Count] = B.[Count]
-- just greater discount matters
ORDER BY A.Discount DESC

-- Clear test stuff
DROP TABLE #Package
DROP TABLE #PackageItem
DROP TABLE #ShoppingCart

答案 1 :(得分:0)

您需要将每组购买的商品应用于每个包裹,或者返回折扣%,如果不符合条件,则返回零,然后从您的包裹集中查询这些结果以获得最大折扣。

答案 2 :(得分:0)

乍一看,这似乎是Knapsack Problem的一个实例,即NP-hard

This paper似乎解决了与您类似的问题。

暴力解决方案

一个强力解决方案是将每个有效的折扣套餐组合应用于订单。

描绘一棵树,对于给定节点,每个祖先代表一个已经应用于订单的折扣包,其每个子代表一个有效的折扣包,可以应用于订单中的其余商品。

当没有更多的包可以应用于订单时,节点就是一个叶子。

如果您有大量商品并且提供超过1个折扣套餐,我不建议这样做。