Sql 自动对商品应用最合身的折扣套餐
我创建了一些折扣套餐: Package1(Item1,Item2,Item5) Discount-5%. Package2(Item2,Item5,Item8) Discount-8% Package3(Item1,Item2) Discount3%. 包装1(项目1、项目2、项目5)折扣-5%。 包装2(项目2、项目5、项目8)折扣-8% 包装3(项目1、项目2)折扣3%。 当一个人在网上购买商品时(例如,他购买了Item1、Item2、Item5、Item10),当我向他显示总价时,我需要自动对商品应用最合适的折扣 在上述情况下,两个折扣将适用于上述选择,但包装1折扣是最好的,因为它给一个人最大的利益。。。所以我需要自动应用这个 有没有人遇到过这种情况,或者有人可以帮助我 DiscountID DiscountName ItemIds Disc% 1 Package1 1,2,5 5 2 Package2 2,3,5 8 3 Package3 1,2 3 折扣ID折扣名称项目ID光盘% 1个包装1,2,5 5 2包装2,3,5 8 3包装3 1,2 3 我随身带着一个人选择的所有ItemId。现在需要申请最合适的折扣Sql 自动对商品应用最合身的折扣套餐,sql,sql-server-2008,stored-procedures,logic,Sql,Sql Server 2008,Stored Procedures,Logic,我创建了一些折扣套餐: Package1(Item1,Item2,Item5) Discount-5%. Package2(Item2,Item5,Item8) Discount-8% Package3(Item1,Item2) Discount3%. 包装1(项目1、项目2、项目5)折扣-5%。 包装2(项目2、项目5、项目8)折扣-8% 包装3(项目1、项目2)折扣3%。 当一个人在网上购买商品时(例如,他购买了Item1、Item2、Item5、Item10),当我向他显示总价时,我需要
感谢您的帮助/指导。您需要将每组购买的商品应用于每个套餐,如果它们不符合条件,则返回折扣%,或零,然后查询这些结果以获得套餐的最大折扣。您需要将每组购买的商品应用于每个套餐,或者返回折扣%,或者零,如果他们不符合条件,则查询这些结果以获得您套餐中的最大折扣。试试这个
-- 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
试试这个
-- 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个折扣套餐,我不建议您使用此选项。乍一看,这似乎是的一个实例,即 似乎解决了与您类似的问题 暴力解决方案 一个强力解决方案是将折扣套餐的所有有效组合应用于订单 想象一个树,其中对于给定的节点,每个祖先代表一个已经应用于订单的折扣包,其每个子节点代表一个可以应用于订单中其余项目的有效折扣包 当没有更多的包可以应用于订单时,节点就是一个叶
如果您有大量商品且提供的折扣套餐不止一个,我不建议您这样做。您有多少个套餐?在给定的订单中,一件商品的一个单位只能分配给一个套餐吗?如果有人购买10件1、10件2和10件5,他们能否在整个订单上获得套餐1折扣?能否在同一订单上应用多个套餐?一个项目只能分配给一个折扣。。我们可以对一个订单(项目数量)应用多个dicount套餐,但单个项目可以获得超过1个折扣。您有多少个套餐?在给定的订单中,一个项目的1个单位只能分配给一个套餐吗?如果有人购买10个项目1、10个项目2和10个项目5,他们能否在整个订单上获得套餐1折扣?能否在同一订单上应用多个套餐?一个项目只能分配给一个折扣。。我们可以对一个订单应用多个dicount软件包(项目数量),但单个项目可以获得1个以上的折扣。Hi Rubens,非常感谢您的回复,您的代码工作正常,但是如果项目选择是这样的,将适用2个软件包。它失败了。。例如,选择(项目1、项目2、项目3、项目5、项目8)和包装为包装1(项目1、项目2)-5%包装2(项目3、项目5)-6%。在这种情况下,没有重叠的包装1和包装2将适用于选择。。在这里它失败了。你有办法克服这周的困难吗。。。我深深地感谢你的时间和努力…谢谢!我不明白你的评论;使用新样本数据运行上面的代码返回package2(6%),这似乎是正确的。您是否尝试删除该
前1名?我遗漏了什么?嗨,鲁宾斯,非常感谢你的回复,你的代码工作得很好,但是在项目选择类似的情况下,两个包将适用。它失败了。。例如,选择(项目1、项目2、项目3、项目5、项目8)和包装为包装1(项目1、项目2)-5%包装2(项目3、项目5)-6%。在这种情况下,没有重叠的包装1和包装2将适用于选择。。在这里它失败了。你有办法克服这周的困难吗。。。我深深地感谢你的时间和努力…谢谢!我不明白你的评论;使用新样本数据运行上面的代码返回package2(6%),这似乎是正确的。您是否尝试删除该前1名?我错过了什么?