2014-07-02 23 views
2

我有一個包含一些支付看起來像這樣的表:行與列的具體和表格

id | from | to | amount 
-------------------------- 
1 | 125 | 135 | 2.4 
2 | 123 | 134 | 1.7 
3 | 124 | 138 | 4.8 
4 | 118 | 119 | 3.9 
5 | 56 | 254 | 23.5 
... 

我需要知道,如果有一種方法,使SQL查詢,會告訴我,如果有是一系列連續的行,其總和達到某個值。例如,如果我想要值6.5,它會返回第2行到第3行。如果我想要12.8,它會返回第1到第4行,依此類推。

我絕對堅持,並希望得到一些幫助。

+0

您需要循環檢查所需輸出的總和,然後輸出行 –

+0

哪個版本的SQL Server? – podiluska

+0

SQL Server 2012 –

回答

2
;with numbers as (select number from master..spt_values where type='p' and number between 1 and (Select MAX(id) from yourtable)), 
ranges as (select n1.number as start, n2.number as finish from numbers n1 cross join numbers n2 where n1.number<=n2.number) 
    select yourtable.* from yourtable 
     inner join 
     (
      select start, finish 
      from ranges 
       inner join yourtable on id between start and finish 
      group by start, finish 
      having SUM(amount)=12.8 
     ) results 
    on yourtable.id between start and finish 
+0

小心使用該「spt_values」表,它似乎是一個未記錄的功能:http://stackoverflow.com/questions/4273723/what-is-the-目的 - 系統表 - 表 - 碩士-spt值和什麼是我 – didierc

+1

它一直在那裏,它可能永遠是http://stackoverflow.com/questions/4273978/why - 如何拆分列使用主-spt值/ 4280038#4280038 – podiluska

+0

謝謝你,真棒查詢。 –

3

我會這樣做,如下所示。首先,計算累計和。那麼,連續行具有特定總和的條件相當於說兩個累積和之間的差等於該值。

with p as (
     select p.*, sum(amount) over (order by id) as cumamount 
     from payments p 
    ) 
select 
from p p1 join 
    p p2 
    on p1.id <= p2.id and 
     (p2.cumamount - p1.cumamount) = 6.5; 

作爲一個說明:如果amount存儲爲因爲非常小的不準確的浮點數這將可能無法正常工作。如果amount裏有一個整數,那就沒事了,但它顯然不是。固定點表示應該沒問題。

+0

我覺得你需要在開始時爲這個方法添加一行,當這個集合在第一行開始時工作? (雖然我沒有2012年的手,所以我可能會誤解) – podiluska

+0

@ podiluska。 。 。但是,如果該集合可以只包含一行,那麼'<'必須是'<='。儘管事實上這個問題似乎強調了複數形式,但我只是做了這個改變。 –

+1

對於以前從未聽說過的人:http://en.wikipedia.org/wiki/Prefix_sum – didierc