【问题标题】:regarding updating rows in table without using loop关于在不使用循环的情况下更新表中的行
【发布时间】:2014-07-02 07:46:32
【问题描述】:

我有一个表,其中我有一个名为数量的列,我有 10 行,其列值相同为 200(它可以是任何值)

要求是:如果输入值为 x=500(或任意数字),则该值应与以下 fasion 中的数量列值进行比较: 如果 1 行的数量是 200,那么它应该从 500 中减去它,x 应该更新为 300,并且该行的数量应该设为 0,那么它应该移动到下一行直到 x 为 0

你能帮我写一下这个的sql查询吗...

要求不要使用循环。

谢谢,

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    SQL Server 的版本是多少?如果是 2012 年或 2014 年,您可以使用以下内容:

    DECLARE @x int = 500
    
    ;WITH cte_sum AS
    (
        SELECT quantity,
           ISNULL(SUM(quantity) OVER (ORDER BY (SELECT NULL) ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) sum_running_before,
           SUM(quantity) OVER (ORDER BY (SELECT NULL) ROWS UNBOUNDED PRECEDING) sum_running_total
    FROM YourTable
    )
    UPDATE cte_sum
    SET quantity = CASE
                    WHEN quantity >= @x - sum_running_before THEN
                         quantity - (@x - sum_running_before)
                    ELSE 0
                END
    WHERE (@x >= sum_running_total OR (@x < sum_running_total AND sum_running_before < @x))
    

    在早期版本中获得运行总计有点棘手,但我认为你明白了主要想法。

    【讨论】:

      【解决方案2】:
      DECLARE @YourTable TABLE
      (
          CustId INT,
          Quantity INT
      )
      
      INSERT INTO @YourTable
      ( CustId, Quantity )
      VALUES
      ( 1, 10 ),
      ( 1, 10 ),
      ( 1, 10 ),
      ( 1, 10 ),
      ( 2, 20 ),
      ( 2, 20 ),
      ( 2, 20 ),
      ( 2, 20 );
      
      ;WITH cte_sum AS
      (
          SELECT 
              y.CustId,
              y.Quantity,
              ROW_NUMBER() OVER (PARTITION BY CustId ORDER BY Quantity) RN
          FROM @YourTable y
      )
      SELECT s1.CustId, s1.Quantity, s2.Qty, s1.Quantity + ISNULL(s2.Qty, 0) RunningTotal, s1.RN
      FROM cte_sum s1
      OUTER APPLY
      (
          SELECT SUM(Quantity) Qty FROM cte_sum s2
          WHERE s2.CustId = s1.CustId
              AND s2.RN < s1.RN
      ) s2
      ORDER BY s1.CustId, s1.RN
      

      这是一个适用于 Sql Server 2005+ 的运行总计示例

      这是输出:

      CustId  Quantity    Qty RunningTotal    RN
      1   10  NULL    10  1
      1   10  10  20  2
      1   10  20  30  3
      1   10  30  40  4
      2   20  NULL    20  1
      2   20  20  40  2
      2   20  40  60  3
      2   20  60  80  4
      

      【讨论】:

        猜你喜欢
        • 2017-01-20
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        • 2013-05-19
        相关资源
        最近更新 更多