2

我有一个使用 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

4

2 回答 2

0

SQLLite 不支持 CTE(特别是递归的),所以我想不出一个简单的方法来做到这一点。也许你最好在你的演示逻辑中这样做。

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

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 来构建无限查询,但是,我确实认为这更适合演示方面。

于 2013-04-16T02:21:39.050 回答
0

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

这可以在 SQL 中解决(参见 sgeddes 的答案),但由于 SQL 的面向集合的设计,计算相当复杂且速度非常慢。

将金额读入程序并在那里解决问题会更好(请参阅维基百科页面上的伪代码)。

于 2013-04-16T08:04:47.817 回答