我创建了一些折扣套餐:
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和我一起选择了一个人。现在需要申请最合适的折扣..
感谢您的帮助/指导。
答案 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个折扣套餐,我不建议这样做。