Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 自动对商品应用最合身的折扣套餐_Sql_Sql Server 2008_Stored Procedures_Logic - Fatal编程技术网

Sql 自动对商品应用最合身的折扣套餐

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),当我向他显示总价时,我需要

我创建了一些折扣套餐:

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。现在需要申请最合适的折扣


感谢您的帮助/指导。

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

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

试试这个

-- 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名
?我错过了什么?