使用sum函数过滤掉表中的随机行

时间:2013-04-16 01:36:42

标签: sql sqlite

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

2 个答案:

答案 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.您可以将更多联合字符串化以获得更多客户端 - 这只是一个示例。

SQL Fiddle Demo

(以下是最多4个客户的示例 - http://sqlfiddle.com/#!7/b01cf/2)。

如果需要,您可以使用动态SQL来构建无限查询,但是,我认为这更适合于演示方。

答案 1 :(得分:0)

您所描述的是knapsack problem(在您的情况下,该值等于权重)。

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

通过阅读计划中的金额并解决问题,您会感觉更好(参见the pseudocode on the Wikipedia page)。