Повторяйте / обновляйте результат, пока сумма столбца (bigint) не станет меньше указанного числа - PullRequest
0 голосов
/ 09 июля 2019

У меня есть таблица с 5 столбцами - [ID], [Имя], [Комментарий], [Статус] и [Размер].Столбец [Статус] необходимо обновить для всех строк, но только до тех пор, пока сумма значений столбца [Размер] не станет меньше 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 будет обновлен в следующей итерации.

Понятно ли сейчас или требуются дополнительные сведения?

1 Ответ

1 голос
/ 10 июля 2019

Единственный способ обойти это - использовать 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 |
+----+-------+--------+------+-------------+

Я полагаю, это то, чего вы хотите достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...