如何选择总和为一定数量的前N行?

时间:2013-07-26 19:26:19

标签: sql sql-server tsql

假设:

MyTable
--
Amount
1
2
3
4
5

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

Amount
1
2
3

由于我想要 TOP N ROWS ,因此1 + 2 + 3 = 6. 2 + 4/1 + 5将无效 对于7/8/9/10,我想要

Amount
1
2
3
4

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 here

答案 2 :(得分: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

答案 3 :(得分:-2)

在SQL Server 2012中,您可以使用此快捷方式获取Grzegorz的结果。 你需要一个ORDER BY来选择Grzegorz的订单 尽管在升级到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