代码之家  ›  专栏  ›  技术社区  ›  Larry Lustig

与目标编号相加的任何一组行

sql
  •  0
  • Larry Lustig  · 技术社区  · 16 年前

    我在销售表中有以下数据:

    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美元。我想定位任何一组行(我不在乎哪一组),这样所选行的总和(billamt)总计为75.00美元。有人能推荐一个SQL查询来完成这个任务吗?

    我用的是一个鲜为人知的利基数据库R:Base(好吧,这是谁) 古老的 ?)它支持大部分SQL-92语法并提供存储过程。我应该能够在我的应用程序中找到任何不使用特定于供应商扩展的SQL-92答案。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Craig Trader    16 年前

    这是 knapsack problem 如果没有大量的过程代码,您将无法在SQL中解决它。对于初学者来说,您将需要递归,而且大多数SQL存储过程在递归方面都不能很好地处理。

        2
  •  0
  •   Austin Salonen gmlacrosse    16 年前

    由于复杂性(这几乎是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完全。链路上定义了一个“近似”算法。

        3
  •  -2
  •   Vitaliy    16 年前

    试试这个:

    从销售中选择*。 其中custid=1 尖点群 总额(billamt)=75