【问题标题】:Loop through/Update the result until sum of a column(bigint) is less than a specified number循环/更新结果,直到列的总和(bigint)小于指定的数字
【发布时间】:2019-07-09 11:23:57
【问题描述】:

我有一个包含 5 列的表格 - [ID]、[Name]、[Comment]、[Status] 和 [Size]。 所有行的[Status]列都需要更新,但直到[Size]列的值的总和小于100。如果总和超过100,剩余的行将在下一次调用中更新。

我能够使用 SUM 函数获得列中值的总和,但在迭代时遇到问题。

请帮忙。

=================================

我会尽量提供更多细节

这是表格数据

ID      Name    Status    size   comment

 1     File1    Pass    20  Transmitted
 2     File2    Pass    30  Transmitted
 3     File3    Pass    50  Transmitted
 4     File4    Pass    10  Transmitted

我想运行更新查询:

Update [sample_table]
  set status ='Completed'
  where SUM(size)<100

所以,它应该更新 File1、File2 和 File3 的状态。剩余的 File4 将在下一次迭代中更新。

现在清楚还是需要更多细节?

【问题讨论】:

  • 请分享您的表格架构、示例数据和预期结果
  • 表看起来像这样:SELECT [Name] (varchar) ,[Comment](varchar) ,[Status](varchar) ,[bytesize](bigint) FROM [sample_table] Column bytesize is has value整数值。我需要在字节大小列的 SUM 小于 100 时对状态列运行更新。
  • 仅供参考,今天是 SQL Server 2008 扩展支持的最后一天;你真的应该看看升级路径。 2008 也不支持OVER 子句中的ROWS BETWEEN 子句,这意味着实现“运行”总数的唯一方法是使用三角连接或Quirky Update 方法。
  • @Larnu - 我明白了。根据我分享的详细信息,您能否提供一个样本?
  • 不,因为您自己没有提供样品。请参阅@Sami 的评论。如果没有更多细节,我们无法给您答案。

标签: sql-server database sql-server-2008 stored-procedures


【解决方案1】:

解决这个问题的唯一方法是在您的 UPDATE 中使用 CTE。

您可以在 SSMS 中运行以下示例:

-- Sample schema.
DECLARE @Data TABLE (
    ID INT, [Name] VARCHAR(50), [Status] VARCHAR(50), [Size] INT, [Comment] VARCHAR(50)
);

-- Sample data.
INSERT INTO @Data ( ID, [Name], [Status], [Size], [Comment] ) VALUES
( 1, 'File1', 'Pass', 20, 'Transmitted' ),
( 2, 'File2', 'Pass', 30, 'Transmitted' ),
( 3, 'File3', 'Pass', 50, 'Transmitted' ),
( 4, 'File4', 'Pass', 10, 'Transmitted' );

-- Update all record's [Comment] to 'Completed' with a SizeTotal <= 100.
WITH running_size AS (
    SELECT ID, SizeTotal = Size FROM @Data WHERE ID = 1
    UNION ALL
    SELECT
        d.ID, running_size.SizeTotal + d.Size
    FROM running_size
    INNER JOIN @Data d ON d.ID = ( running_size.ID + 1 )
)
UPDATE @Data
SET 
    [Comment] = 'Completed'
FROM @Data d
INNER JOIN running_size rs
    ON d.ID = rs.ID
WHERE
    rs.SizeTotal <= 100;

-- Show me the money.
SELECT * FROM @Data ORDER BY ID;

返回:

+----+-------+--------+------+-------------+
| ID | Name  | Status | Size |   Comment   |
+----+-------+--------+------+-------------+
|  1 | File1 | Pass   |   20 | Completed   |
|  2 | File2 | Pass   |   30 | Completed   |
|  3 | File3 | Pass   |   50 | Completed   |
|  4 | File4 | Pass   |   10 | Transmitted |
+----+-------+--------+------+-------------+

我认为这就是您想要实现的目标?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多