Используйте СУММУ в обновлении заявления, где критерии - PullRequest
2 голосов
/ 08 июля 2010

Я пытался найти это и не уверен, что использую правильные термины. Или, может быть, это просто невозможно. Но я пытаюсь обновить все записи в таблице, которые составляют суммарное значение, которое меньше установленного значения.

Итак, вот пример:

ID   type    amount   received_date    processed_date
1    debit   10       7/1/2010         NULL
2    debit   10       7/2/2010         NULL
3    debit   10       7/3/2010         NULL

Теперь я хочу обновить все записи, сумма которых меньше 22 только те записи, которые имеют значение null для processing_date. Я также хочу, чтобы он работал так, чтобы он обновлялся от самого старого до самого нового.

Вот как я бы написал это в псевдокоде:

UPDATE credits
SET date_processed = '8/1/2010'
WHERE SUM(amount) <= @total AND
    credit_type = [debits]

Но я знаю, что это не работает. Поэтому я надеюсь, что у какого-нибудь мастера SQL могут появиться идеи.

Я уверен, что мог бы написать это в пределах курсора, но мне интересно, есть ли способ, основанный на множестве, чтобы выполнить это.

РЕДАКТИРОВАТЬ: Я обновил таблицу и краткое описание ниже, чтобы лучше изобразить мои обстоятельства.

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Строки в таблице SQL представляют неупорядоченный список элементов.Таким образом, мы должны предоставить заказ.В вашем примере вы намекаете, что он должен обрабатывать строки, упорядоченные по Id.

Update TableName
Set processed_date = '2010-08-01'
Where [type] = 'debit'
    And Exists      (
                    Select 1
                    From TableName As C1
                    Where C1.Id <= TableName.Id
                        And C1.[type] = 'debit'
                    Having Sum(C1.amount) <= @total
                    )

Как я уже упоминал в комментариях, небезопасно полагаться на то, что Id является маркером последовательности.Возможно иметь пробелы и кто-то может вставлять «более поздние» строки в эти пробелы, используя IDENTITY_INSERT.Вместо этого вы должны использовать столбец datetime.Если этот столбец равен received_date, просто замените Id на received_date в приведенном выше запросе.

1 голос
/ 08 июля 2010

Вы должны использовать предложение HAVING для ситуаций такого типа.

Согласно w3schools, «предложение HAVING было добавлено в SQL, поскольку ключевое слово WHERE не может использоваться с агрегатными функциями.»

UPDATE credits
SET date_processed = '8/1/2010'
WHERE credit_type = [debits]
HAVING SUM(amount) <= @total 

Вот отличное руководство, которое можно найти в w3schools

http://www.w3schools.com/SQL/sql_having.asp

...