0

鉴于此表:

http://www.w3schools.com/sql/trysql.asp?filename=trysql_func_sum

我将如何生成数量总和最多为 90 的 OrderId 列表。如何在 SQL 中表达相同的内容?同一个查询可以有多个答案。你将如何生成它们?在某种程度上,这对我来说也像是背包问题,但我不知道如何在 SQL 中表达相同的意思。

您可能需要执行查询

SELECT * FROM OrderDetails;

在网页中

4

2 回答 2

0

您可以在 Postgres 中使用递归 CTE 执行此操作,但这将非常低效:

With Recursive search_orders(maxid, quantity, used) AS (
    Select
        od.OrderDetailsID,
        od.quantity,
        array[od.OrderDetailsID]
    from
        OrderDetails od
    Where
        quantity < 90
    Union All
    Select
        od.OrderDetailsID,
        sod.quantity + od.quantity,
        used || od.OrderDetailsID
    From
        OrderDetails od,
        search_orders sod
    Where
        od.OrderDetailsID > sod.maxid and
        od.quantity < 90 - sod.quantity
)
Select
    used,
    quantity
From
    search_orders sod
Where
    not exists (
        select 'x'
    from
        OrderDetails od
    Where
        Not od.OrderDetailsID = Any(used) and
        od.quantity < 90 - sod.quantity
    )    

如果您想要所有组合,无论您是否可以在不超过数量限制的情况下添加另一个项目,您都可以删除最后一个 where 子句

Example SQL Fiddle

于 2013-11-01T00:43:01.253 回答
0
SELECT OrderID, SUM(Quantity) AS TotalItemsOrdered 
FROM OrderDetails
GROUP BY OrderID
HAVING SUM(Quantity)<= 90
于 2013-10-31T23:53:43.423 回答