我有一个使用sqlite设计的费用表我想构建一个查询,使用表格的amount列上的sum函数过滤掉一些随机行。
示例Expense
表
Clients Amounts
A 1000
B 3000
C 5000
D 2000
E 6000
假设我希望上表中的总和为10,000,我想构建一个查询,它将返回任意数量的randoms行,最多可累计10,000个
到目前为止,我试过
SELECT *
FROM Expense Table
GROUP BY (Clients)
HAVING SUM(AMOUNT)=10000
但我没有生成任何内容
我也有随机函数,但我假设我需要指定一个LIMIT
答案 0 :(得分:0)
SQLLite不支持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。这适用于任何一组客户端,1到3,其总和为10000.您可以将更多联合字符串化以获得更多客户端 - 这只是一个示例。
(以下是最多4个客户的示例 - http://sqlfiddle.com/#!7/b01cf/2)。
如果需要,您可以使用动态SQL来构建无限查询,但是,我认为这更适合于演示方。
答案 1 :(得分:0)
您所描述的是knapsack problem(在您的情况下,该值等于权重)。
这可以在SQL中解决(参见sgeddes的回答),但由于SQL的面向集合设计,计算相当复杂且非常慢。
通过阅读计划中的金额并解决问题,您会感觉更好(参见the pseudocode on the Wikipedia page)。