假设:
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,如果这很重要的话。
答案 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