автоматически применять лучшие скидки на товары - PullRequest
1 голос
/ 01 сентября 2010

Я создал несколько пакетов скидок:

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

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

В указанном выше случае на указанный выбор будут применяться две скидки, однако Пакет1 Скидка лучше всего, поскольку она дает человеку максимальную выгоду .... так что мне нужно применить это автоматически.

Есть кто-нибудь, кто сталкивался с этим типом сценария или кто-то, кто мог бы мне помочь?

DiscountID DiscountName ItemIds Disc%

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

У меня есть все ItemId,который человек выбрал.Теперь нужно применить скидку наилучшего соответствия.

Ценим вашу помощь / руководство.

Ответы [ 3 ]

1 голос
/ 01 сентября 2010

Попробуйте это

-- 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
0 голосов
/ 02 сентября 2010

На первый взгляд кажется, что это пример проблемы с рюкзаком , то есть NP-hard .

Эта бумага кажется, решает проблему, аналогичную вашей.

Решение для грубой силы

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

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

Узел - это лист, когда к заказу нельзя применить больше пакетов.

Я бы не рекомендовал это делать, если у вас большое количество товаров и более 1 пакета скидок.предлагается.

0 голосов
/ 01 сентября 2010

Вам необходимо применить каждый набор приобретенных товаров к каждому пакету, либо вернуть% скидки, либо ноль, если они не соответствуют требованиям, а затем запросить эти результаты для получения максимальной скидки из вашего набора пакетов.

...