【问题标题】:Subtract variable from column while variable has remaining value从列中减去变量,而变量具有剩余值
【发布时间】:2015-11-23 13:14:38
【问题描述】:

我有一列具有不同的数值。我有一个名为 X 的数值变量,值为 50000。

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

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

当变量 x 具有值时,我需要以某种方式将值从 col1 覆盖到零。如何得到以下结果?

  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     

【问题讨论】:

  • 您希望输出是什么? (col2 来自哪里?)
  • 我需要以某种方式将值从 col1 覆盖到零,而变量 x 具有值..
  • 看起来像是 this 问题的变体。

标签: sql-server tsql sql-server-2014


【解决方案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

这是未经检查就在我脑海中诞生的版本。我现在无法检查,但我认为它应该可以工作并且它是基于集合的。

这个想法是计算一个总和:

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

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

【讨论】:

  • 如果@X 的值为 1000,那么 col2 中的第一行需要为 4000,第二个 1000,第三个 10000,四个 12000,五个 300 和六个 35000 会怎样
  • 那么如果@X 是 7000 那么第一行将是 0,第二行是 0,第三行是 8000 和四个 12000,五个 300,六个 35000。我需要涵盖所有情况。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多