我在SALES表中有以下数据:
BillItemID CustID BillDate Item BillAmt
1001 1 09-10-01 Suit $50.00
1002 1 09-10-01 Shirt $20.00
1003 1 09-10-01 Pants $20.00
1004 1 09-10-01 Tie $5.00
1005 1 09-01-10 Tie $5.00
客户#1现在支付75.00美元。我想找到任何一组行(我不关心哪一组),使得所选行的SUM(BillAmt)总计为$ 75.00。任何人都可以建议一个SQL查询来执行此操作吗?
我正在使用一个名为R:Base的模糊小众数据库(好的,这里是谁旧?),它支持大部分SQL-92语法并提供存储过程。我应该能够在我的应用程序中使用任何不使用特定于供应商的扩展的SQL-92答案。
答案 0 :(得分:4)
这是knapsack problem的变体,如果没有很多程序代码,你就不会在SQL中解决它。对于初学者来说,你将需要递归,并且大多数SQL存储过程都不能很好地应对递归。
答案 1 :(得分:0)
由于复杂性(这几乎是W. Craig Trader所述的背包问题),我建议根据您定义的优先级添加更新的PaidAmt
列。
从您的示例中,客户支付75.00美元并假设最昂贵的项目先付清:
BillItemID CustID BillDate Item BillAmt PaidAmt
1001 1 09-10-01 Suit $50.00 $50.00
1002 1 09-10-01 Shirt $20.00 $20.00
1003 1 09-10-01 Pants $20.00 $5.00
1004 1 09-10-01 Tie $5.00 $0.00
1005 1 09-01-10 Tie $5.00 $0.00
经过多一点挖掘,这是Subset Sum问题并且是NP-Complete。在链接上定义了“近似”算法。
答案 2 :(得分:-2)
试试这个:
从销售中选择* 其中custid = 1 custid小组 总和(billamt)= 75