-2

认为:

MyTable
--
Amount
1
2
3
4
5

MyTable只有一列,Amount,有 5 行。它们不一定按递增顺序排列。
如何创建一个函数,该函数接受 a@SUM INT并返回总和为该数量的TOP N 行?
所以对于输入 6,我想要

Amount
1
2
3

因为 1 + 2 + 3 = 6. 2 + 4 / 1 + 5 不起作用,因为我想要TOP N ROWS
对于 7/8/9/10,我想要

Amount
1
2
3
4

如果这很重要,我正在使用 MS SQL Server 2008 R2。

4

4 回答 4

5

当涉及到关系数据库时,说“前 N 行”确实是模棱两可的。

我假设您想按“金额”升序排序。

我会添加第二列(到表或视图),如“sum_up_to_here”,并创建类似的内容:

create view mytable_view as 
select 
 mt1.amount, 
 sum(mt2.amount) as sum_up_to_here 
from 
 mytable mt1 
 left join mytable mt2 on (mt2.amount < mt1.amount)
group by mt1.amount

或者:

create view mytable_view as 
select 
 mt1.amount, 
 (select sum(amount) from mytable where amount < mt1.amount) 
from mytable mt1

然后我会选择最后的行:

select amount from mytable_view where sum_up_to_here < (some value)

如果您不关心性能,您当然可以在一个查询中运行它:

select amount from 
(
select 
 mt1.amount, 
 sum(mt2.amount) as sum_up_to_here 
from 
 mytable mt1 
 left join mytable mt2 on (mt2.amount < mt1.amount)
group by mt1.amount
) t where sum_up_to_here < 20
于 2013-07-26T19:38:30.500 回答
3

一种方法:

select t1.amount 
from MyTable t1
left join MyTable t2 on t1.amount > t2.amount
group by t1.amount
having coalesce(sum(t2.amount),0) < 7

SQLFiddle在这里

于 2013-07-26T19:44:21.630 回答
0

在 Sql Server 中,您可以使用 CDE 使其非常易于阅读。

这是我做的一个 CDE 来总结按顺序使用的总数。CDE 类似于上面的连接,并且将总数保持到任何给定的索引。在 CDE 之外,我将它加入到原始表中,这样我就可以将它与其他字段一起选择。

;with summrp as (
    select m1.idx, sum(m2.QtyReq) as sumUsed
    from #mrpe m1
    join #mrpe m2 on m2.idx <= m1.idx
    group by m1.idx
)

select RefNum, RefLineSuf, QtyReq, ProjectedDate, sumUsed from #mrpe m
join summrp on summrp.idx=m.idx
于 2018-11-09T01:32:16.937 回答
-2

在 SQL Server 2012 中,您可以使用此快捷方式获得类似 Grzegorz 的结果。您将需要一个 ORDER BY 来选择与 Grzegorz's 一样的订单,尽管在您升级到 2012 或使用 Oracle 或 DB2 时投反对票,但我将把它留在这里。

SELECT amount 
FROM (
  SELECT * ,
  SUM(amount) OVER (ORDER BY amount ASC) AS total
  from demo
) T
WHERE total <= 6

手中的小提琴... http://sqlfiddle.com/#!6/b8506/6

于 2013-07-26T19:34:08.243 回答