根据SQL C#中的条件增加每一行

1 sql-server t-sql sql-server-2014

我有一个 textBox 的值为 100,我想在 stock_out 列中增加该值,但只有直到 stock_out 列等于 stock_in 列,如果第一行值是 40 比第一行 stock_out 应该从 100 增加 10 比100(90) 的剩余值应在其下方的行中递增,然后在其下方的行中递增,直到需要为止(直到 100 为 0)。项目按 Item_Name 和 Bill No asc 排序。

Bill No   Item_Name   Stock_in  Stock_out  stock_in_hand
1          chicken       50        40           10
2          chicken       40         0           40
5          chicken       60        10           50
6          chicken       100       20           80
3          fish          100       30           70
4          fish          20        20            0
Run Code Online (Sandbox Code Playgroud)

要得到的结果。

Bill No   Item_Name   Stock_in  Stock_out  stock_in_hand
1          chicken       50        50           0
2          chicken       40        40           0
5          chicken       60        60           0
6          chicken       100       20          80
3          fish          100       30          70
4          fish          20        20           0
Run Code Online (Sandbox Code Playgroud)

这是到目前为止我已经能够完成的代码,但它需要大量的工作,而且我没有 cte 或任何复杂的 c# 编码方面的专业知识。我正在使用 SQL Server 2014 和 C#。

C#代码SQL查询

select * 
from stock_recieve 
where Item_Name like'" + comboBoxitem.Text + "' 
where Stock_out < Stock_in 
order by [Bill No] asc;

update stock_recieve 
     set Stock_out = Stock_out+" + qty + "
where Stock_out < Stock_in;
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

PS 我知道 sql 注入,我会将我的 sql 查询更改为参数化查询。

100 是通过文本框从用户获取的示例值,我如何实现代码以从文本框接收值。

ype*_*eᵀᴹ 6

您可以使用窗口函数计算stock_in_hand派生表或 CTE 中的滚动总和(of ),然后使用它来相应地更新表:

WITH upd AS
  ( SELECT 
        [Bill No],
        Item_Name,
        Stock_in,
        Stock_out,
        stock_in_hand,
        sum_stock = COALESCE(
            SUM(stock_in_hand) OVER (ORDER BY Item_Name, [Bill No]
                                     ROWS BETWEEN UNBOUNDED PRECEDING
                                              AND 1 PRECEDING)
            , 0) 
    FROM
        stock_recieve
  )
UPDATE upd
SET Stock_out = Stock_out
        + CASE WHEN 100 - sum_stock >= stock_in_hand
              THEN stock_in_hand
              ELSE 100 - sum_stock
          END,
    stock_in_hand = stock_in_hand
        - CASE WHEN 100 - sum_stock >= stock_in_hand
              THEN stock_in_hand
              ELSE 100 - sum_stock
          END 
WHERE sum_stock < 100 ;
Run Code Online (Sandbox Code Playgroud)