2016-04-16 8 views
0

こんにちは私は、下の表のCurrentQuantityフィールドを埋め戻すクエリを記述する必要があります。私はもともとwhileループを使用することを考えていましたが、これを達成するために再帰的なクエリを書く方法があるかどうかは疑問です。リバースエンジニアのリバースエンジニアリング

現在のところ、currentQuantityは現在のレコードのcurrentQuantity + QuantityChangedです。したがって、このシナリオでは、ID-11のcurrentQuantityは現在のレコードの-45 + QuantityChangedであるID 20のCurrentQuantity(-5 * -1)なので、-40になります。

IDカラムは常にインクリメンタルなので、これを前提にすることができます。

私はCTEを使用して再帰的なクエリを作成しようとしていますが、どこから実際に開始するのかはわかりません...どんなヘルプも高く評価されます!

enter image description here

+0

本当に再帰が必要ですか?ベースラインのCurrentQuantity値(最初または最後)がある場合、実際には以前のすべてのQuantityChanged値を合計し、その結果を各行のベースラインに追加することができます。 –

+1

問題を解決するために必要ではない情報を提供することは、常に避けてください。この場合、必須フィールドはIDフィールドと数量フィールドだけです。このようにして、あなたの投稿はより洗練されたものになり、人々の答えがより魅力的になります。 – FLICKER

答えて

0

あなたのデータは実際には関係ありませんので、それほど大きくありません。しかし、それを行うことができます - 例コード:

create table #data (id int, currentQuantity int, quantityChanged int); 

insert into #data values (-30, NULL, -10); 
insert into #data values (-24, NULL, -10); 
insert into #data values (-22, NULL, -10); 
insert into #data values (-11, NULL, -5); 
insert into #data values (20, -45, -5); 

select * from #data; 

;with rcte as (
    select id, currentquantity, quantityChanged, 0 as Level 
    from #data where id = 20 
    union all 
    select d.id, r.currentquantity + (d.quantityChanged * -1), 
    d.quantityChanged, level + 1 
    from #data d inner join rcte r on d.id < r.id 
) 
update #data 
set currentQuantity = r.currentQuantity 
from #data d 
inner join rcte r 
on d.id = r.id 
inner join (
    select id, row_number() over (order by id desc) - 1 level 
    from #data 
) idl 
on r.id = idl.id 
and r.level = idl.level; 

select * from #data; 

それはあなたが探しているものを生成する必要があります。

注:SQL Server> 2008を使用している場合は、これを行うために先導機能を使用することもできます。