2015-11-23 59 views
1

我有一列有不同数值的列。我有一个名为X的数值变量与50000从列中减去变量,而变量有剩余的值

rownumber   col1 
-------------------------- 
    1    5000 
    2    1000 
    3    10000 
    4    12000 
    5     300 
    6    35000 

DECLARE @X AS decimal(18,2) = 50000 

的值,我需要以某种方式覆盖从COL1的值为零,而变量x具有价值。如何获得以下结果?

rownumber   col1  col2   

    1     5000  0  
    2     1000  0  
    3    10000  0  
    5     300  0  
    6    35000  13300 

如果@X = 1000,那么结果应该是:

rownumber   col1  col2   

    1     5000  4000   
    2     1000  1000  
    3    10000  10000  
    4    12000  12000  
    5     300  300  
    6    35000  35000  
+0

你想要的输出是什么? (和col2'从哪里来?) – Amit

+0

我需要以某种方式覆盖从col1到零的值,而变量x是有价值的。 – Dejan

+0

看起来像[this]上的变体(http://stackoverflow.com/questions/9420173/sql-subtracting-a-depleting-value-from-rows)的问题。 – HABO

回答

1

您可以运行总和做到这一点:

with cte as(select *, sum(col1) over(order by rn) as s from t) 
select rn, col1, 0 as col2 from cte where s <= 1000 
union all 
select * from (select top 1 rn, col1, s - 1000 as col2 from cte where s > 1000 order by rn)t 
union all 
select * from (select rn, col1, col1 as col2 from cte where s > 1000 order by rn offset 1 row)t 

这是出生在我的头上没有版本检查。我现在无法检查,但我认为它应该可以工作,并且基于setbased。

的想法是让运行总和:

rownumber col1 s   
1   5000 5000  
2   1000 6000 
3   10000 16000  
4   12000 28000 
5   300 28300  
6   35000 63300 

现在你选择的所有行s <= 50000。这会给你rn{1,2,3,4,5}。请注意,您使col2全零。在第二个联盟中,您正在选择第一排,其中s > 50000。这会给你rn{6}。注意col2 is 63300 - 50000 = 13300。现在,如果您有其他行,那么您在第三个联合中选择那些行,除了我们已经在第二个联合中选择的第一行。

+0

如果@X的值为1000,那么col2中的第一行需要4000,第二个1000,第三个10000,1个四个12000,5个300和六个35000 – Dejan

+0

好吧,我现在得到它 –

+0

然后再次如果@X是7000然后第一个行将是0,第二个0,第三个8000和四个12000,五个300,六个35000.我需要覆盖所有情况。 – Dejan