2011-05-04 86 views
4

60%的值假设我有这样的一个表:如何选择总结到的总

AB 3
CD 1
EF 2
GH 4

总和最后一列的数字是10,我想要总和最大值至少达到总价值的60%。所以,在这种情况下,它会返回

G H 4
A B 3

它上升到70%,但如果只选择了第一个值,它只会上升到40%。尽管可能有一个组合会返回60%,但我们希望获得最大的数字。所以,我想我知道如何将数值从大到小排序,以及如何总结所有的值,但是我不知道如何只取总和达到60%的线。

+0

这基本上是计算运行总数。这是什么RDBMS? – 2011-05-04 12:52:39

+0

你是否需要占总数的百分比,或者你是否只需要一个目标数字?如果您有100个不同的值,并且您希望所有记录的总和达到但不超过特定数量(例如453),那么这些数值是否会起作用? – 2011-05-04 12:54:37

回答

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

您对保留字'table','outer'和'inner'的使用使得这个查询非常难以阅读。 – onedaywhen 2011-05-04 12:54:55

+0

是的,你说得对,我已经纠正它,谢谢 – bpgergo 2011-05-04 12:57:44

+1

我认为它应该是'i.val <= o.val'。在线演示http://data.stackexchange.com/stackoverflow/q/99506/ – 2011-05-04 13:04:33

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) 
+0

什么是按顺序?例如,您可以通过使用CTE来避免临时表。 – onedaywhen 2011-05-04 13:10:32

+0

由于OP需要x最高值,所以需要order by – jeroenh 2011-05-04 13:25:12

+0

您是对的。我应该提到:我不是SQL专家:-)。通过 – jeroenh 2011-05-04 15:24:41