我有一个使用sqlite设计的费用表,我想构造一个查询以使用表的数量列上的sum函数过滤掉一些随机行。

样品Expense

Clients          Amounts
A                  1000
B                  3000
C                  5000
D                  2000
E                  6000

假设我希望上表中的总和为10,000,我想构造一个查询,该查询将返回任意数量的随机行,这些行总计为10,000

到目前为止,我尝试过

SELECT * 
FROM Expense Table 
GROUP BY (Clients) 
HAVING SUM(AMOUNT)=10000 

但我什么也没产生

我也可以使用随机函数,但我假设我需要指定一个LIMIT

===============>>#1 票数:0

SQLLite不支持CTE(特别是递归CTE),因此我想不出一种简单的方法。 也许您最好在演示逻辑中这样做。

通过SQL的一种选择是将多个UNION语句串在一起。 使用上面的样本数据,您将需要串3个UNIONs以获得结果:

select clients
from expense
where amounts = 10000
union 
select e.clients || e2.clients
from expense e
   inner join expense e2 on e2.rowid > e.rowid
where e.amounts + e2.amounts = 10000 
union 
select e.clients || e2.clients || e3.clients
from expense e
   inner join expense e2 on e2.rowid > e.rowid
   inner join expense e3 on e3.rowid > e2.rowid
where e.amounts + e2.amounts + e3.amounts = 10000

产生ABE和BCD。 这适用于总和为10000的1到3个客户组。您可以输入更多的并集来获得更多的客户-这只是一个例子。

SQL小提琴演示

(这是一个示例,最多可包含4个客户端-http: //sqlfiddle.com/# !7/ b01cf/2 )。

如果需要,您可能可以使用动态sql来构造无休止的查询,但是,我确实认为这更适合表示方面。

===============>>#2 票数:0

您所描述的是背包问题 (在您的情况下,该值等于重量)。

这可以在SQL中解决(请参阅sgeddes的答案),但是由于SQL的面向集合的设计,因此计算相当复杂且非常缓慢。

通过将金额读入程序并在那里解决问题,将会更好(请参阅Wikipedia页面上的伪代码 )。

  ask by Benn Ogidan translate from so

未解决问题?本站智能推荐: