在不使用While/Cursor的情况下,SQL Server产品列表中给定数量的最大产品数?

ruoxqz4g  于 2022-12-03  发布在  SQL Server
关注(0)|答案(1)|浏览(148)

我有一个名为“Product”的表

Create table products(ProductName VARCHAR(100), Price INT, Quantity INT)

Insert into products values ('Pencil',3,20)
Insert into products values ('Rubber',4,5)
Insert into products values ('Scale',15,4)

ProductName  Price       Quantity
------------------------ -----------
Pencil       3           20
Rubber       4           5
Scale        4           15

以下是要求。

最多花100美元可以购买多少件物品?
我只需要输出值为26。(*20铅笔+ 5橡皮+ 1比例 *)
我不想要的项目清单,我只需要最大可能的产品。
如果表中只有以下值

ProductName  Price       Quantity
------------ ----------- -----------
Book         90          2
Note         120         4

我只需要退回1(* 不能购买超过1本书的产品 *)
这需要在T-SQL中实现。我们不允许使用WHILECURSOR

uxhixvfz

uxhixvfz1#

您可以使用递归公用表表达式(CTE)来创建每种可能的情况,查询如下所示:

DECLARE @Query NVARCHAR(max) = ';WITH cte as (
    SELECT ProductName,Price,1 AS Qte
    FROM #products
    UNION ALL
    SELECT cte.ProductName,cte.Price,Qte + 1
    FROM cte
    JOIN #products p ON p.ProductName = cte.ProductName
    WHERE cte.Qte < p.Quantity
)
SELECT MAX(c1.Price * c1.Qte + c2.Price * c2.Qte + c3.Price * c3.Qte), MAX(c1.Qte + c2.Qte + c3.Qte) 
FROM cte c1'

;with cte as 
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY ProductName) AS NB_CONDITION, 1 AS increment
    FROM #products

    UNION ALL

    SELECT p.*,c.NB_CONDITION,increment + 1
    FROM cte c
    JOIN #products p ON c.ProductName = p.ProductName 
    WHERE c.increment < NB_CONDITION
)

SELECT @Query = @Query + CONCAT(' INNER JOIN cte c', NB_CONDITION, ' ON ', STRING_AGG(CONCAT('c' ,NB_CONDITION ,'.ProductName <> c', increment , '.ProductName'), ' AND '))
FROM cte
WHERE NB_CONDITION <> increment
GROUP BY NB_CONDITION

SET @Query = @Query + ' WHERE c1.Price * c1.Qte + c2.Price * c2.Qte + c3.Price * c3.Qte <= 100'

PRINT (@Query)

exec (@Query)

我使用动态SQL来创建关节,以确保不同的组合。

相关问题