如何选择总和达到总数60%的值

4
假设我有这样一张表:
A B 3 C D 1 E F 2 G H 4
最后一列的总和是10,我希望选择加起来至少占总值60%的最大值。所以,在这种情况下,它将返回:
G H 4 A B 3
它达到了70%,但如果只选择第一个值,则只能达到40%。即使可能存在一种组合恰好返回60%,我们也要选择最大的数字。
因此,我知道如何按从大到小的顺序排序这些值,并计算所有值的总和,但我不知道如何仅选择总和为60%的行。

这基本上是计算累计总数。这是哪种关系型数据库管理系统? - Martin Smith
你需要总数的百分比还是只是一个目标数字?如果你有100个不同的值,想要所有记录的总和达到但不超过某个数字(例如453),这样可以吗? - Christopher Klein
2个回答

4
--save the whole sum into a variable
summa = select sum(val) from sometable;

select * 
  from sometable o 
 where (
        select sum(val) 
          from sometable i 
         where i.val <= o.val
       ) >= 0.6*summa;

1
你使用了保留字 tableouterinner,使得这个查询语句非常难以阅读。 - onedaywhen
1
我认为应该是 i.val <= o.val。在线演示请访问 http://data.stackexchange.com/stackoverflow/q/99506/。 - Martin Smith
是的,你说得对。而且在线演示:我只能说哇!谢谢。 - bpgergo

3

我认为这将给您正确的结果。需要使用临时表进行操作,不确定是否可以避免此操作。

DECLARE @total bigint

select @total = SUM(value) from SampleTable

select st.*, 
convert(decimal(10,2), (select SUM(value) from SampleTable st2 where st2.Value >= st.Value))/@total as percentage
into #temptable
from sampletable st

select * from #temptable 
where Value >= (select max(Value) from #temptable where percentage >= 0.6)

"order by是用来干什么的?你可以使用CTE来避免使用临时表,例如。" - onedaywhen
需要使用“order by”语句,因为操作者需要获取前x个最高的值。 - jeroenh
你说得对。我应该提一下:我不是SQL专家 :-)。已经移除了order by。 - jeroenh
两个答案都是正确的,但他有一个在线演示,所以只能给你点赞 :) - n00b programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接