2011-05-04 90 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