SQL选择最多一定的金额

时间:2019-03-09 07:02:58

标签: sql sql-server sql-server-2008-r2

我一直在试图找到一种编写SQL脚本以选择给定总和的方法,并希望能为此提供任何想法。

我正在尝试根据收到的货物的日期进行库存评估。在月底收盘时,我在仓库中剩余的库存价值将是最后收到的货物的指定总和。

以下查询由两个联合完成,但简化为:

SELECT DATE, W1 FROM Table
ORDER BY DATE DESC

查询结果:

Row     DATE                W1      
1       2019-02-28 00:00:00 13250   
2       2019-02-28 00:00:00 42610   
3       2019-02-28 00:00:00 41170   
4       2019-02-28 00:00:00 13180   
5       2019-02-28 00:00:00 20860   
6       2019-02-28 00:00:00 19870   
7       2019-02-28 00:00:00 37780   
8       2019-02-28 00:00:00 47210   
9       2019-02-28 00:00:00 32000   
10      2019-02-28 00:00:00 41930   

我曾考虑过通过如下计算累计和来解决此问题:

Row     DATE                W1      Cumulative Sum
1       2019-02-28 00:00:00 13250   13250         
2       2019-02-28 00:00:00 42610   55860         
3       2019-02-28 00:00:00 41170   97030         
4       2019-02-28 00:00:00 13180   110210        
5       2019-02-28 00:00:00 20860   131070        
6       2019-02-28 00:00:00 19870   150940  
7       2019-02-28 00:00:00 37780   188720  
8       2019-02-28 00:00:00 47210   235930  
9       2019-02-28 00:00:00 32000   267930  
10      2019-02-28 00:00:00 41930   309860  

但是,当我想出一种使用参数只返回感兴趣的行的方法时,我会陷入困境。

例如,如果将参数指定为“ 120000”,它将返回累计总和正好为120000的行。

Row     DATE                W1      Cumulative Sum  W1_Select
1       2019-02-28 00:00:00 13250   13250           13250
2       2019-02-28 00:00:00 42610   55860           42610
3       2019-02-28 00:00:00 41170   97030           41170
4       2019-02-28 00:00:00 13180   110210          13180
5       2019-02-28 00:00:00 20860   131070          9790
                                                    ----------
                                    Total           120000 

1 个答案:

答案 0 :(得分:0)

这只需要一些算术运算即可:

select t.*,
       (case when running_sum < @threshold then w1
             else @threshold - w1
        end)
from (select date, w1, sum(w1) over (order by date) as running_sum
      from t
     ) t
where running_sum - w1 < @threshold;

实际上,对于您而言,日期都是相同的。这有点违反直觉,但是您需要使用该行才能起作用:

select t.*,
       (case when running_sum < @threshold then w1
             else @threshold - w1
        end)
from (select date, w1, sum(w1) over (order by row) as running_sum
      from t
     ) t
where running_sum - w1 < @threshold;

Here是db <>小提琴。