2

私はこれを検索しようとしてきましたが、正しい用語を使用しているかどうか確信が持てません。あるいは、それが不可能なだけかもしれません。しかし、私がやろうとしているのは、設定値より小さい合計値を構成するテーブル内のすべてのレコードを更新することです。

以下に例を示します。

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 未満のすべてのレコードを更新することです。そのため、ID 1 と 2 の合計を実行すると、22 未満の 20 になります。 processed_date に null を指定します。また、古いものから新しいものへと更新されるように動作させたいと考えています。

基本的に、擬似コードで記述する方法は次のとおりです。

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

しかし、私はこれがうまくいかないことを知っています。だから私は、いくつかの SQL マスターがアイデアを持っていることを願っています。

これをカーソル内に書き込むことができると確信していますが、これを実行するためのセットベースの方法があるかどうか疑問に思っています。

編集:私の状況をよりよく表すために、以下の表と簡単な説明を更新しました。

4

2 に答える 2

2

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を置き換えます。Idreceived_date

于 2010-07-08T19:36:00.887 に答える
1

このような状況では、HAVING 句を使用する必要があります。

w3schools によると、「集計関数で WHERE キーワードを使用できなかったため、SQL に HAVING 句が追加された」とのことです。

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

于 2010-07-08T19:12:02.363 に答える