0

前の値の合計からフィールドに入力する必要があります。例えば:

Id          Price           Total that i need     
----------- ------------  ---------
1           500             500
2           200             500+200 = 700
3           NULL            Because price is null put previous value = 700
4           300             SUM of previous row = 500+200+(calc to 700)+ 300 = 1700 
5           NULL            Because price is null put previous value = 1700  

変数を使用できないことに注意してください。

また、サブクエリを使用していますが、機能しません (null ではない価格の合計のみが返されます)。

sql はリアルタイムで価格を更新できますか (カーソルのようにレコードごとにレコードします)?

4

3 に答える 3

0

実際、これは現在の合計を計算する典型的なタスクです。

これを試して

create table #t(id int, price decimal(10,2), tot_sum decimal(10,2))

insert #t(id, price) values(1, 500)
insert #t(id, price) values(2, 200)
insert #t(id, price) values(3, NULL)
insert #t(id, price) values(4, 300)
insert #t(id, price) values(5, NULL)

update a
set tot_sum=gr.tot_sum
from #t a 
     join(select a.id, max(a.price) as price, sum(isnull(b.price, 0))+max(isnull(a.price,0)) as tot_sum
            from #t a 
                 left join #t b on b.id < a.id
            group by a.id) gr on a.id=gr.id

select * from #t t order by id


drop table #t
于 2013-03-01T05:17:17.590 に答える
0

CTEを勉強する必要があります。共通テーブル式 (CTE) は、単一の SELECT、INSERT、UPDATE、DELETE、または CREATE VIEW ステートメントの実行範囲内で定義される一時的な結果セットと考えることができます。

CTE は、オブジェクトとして格納されず、クエリの間だけ存続するという点で、派生テーブルに似ています。派生テーブルとは異なり、CTE は自己参照することができ、同じクエリで複数回参照できます。CTE は次の目的で使用できます。

  • 再帰クエリを作成します。詳細については、共通テーブル式を使用した再帰クエリを参照してください。
  • ビューの一般的な使用が必要ない場合に、ビューの代わりに使用します。つまり、定義をメタデータに保存する必要はありません。
  • スカラー副選択から派生した列、または決定論的でない関数または外部アクセスを持つ関数によるグループ化を有効にします。
  • 結果のテーブルを同じステートメントで複数回参照します。
于 2013-03-01T05:28:22.477 に答える
0

やや珍しいものの、興味深い問題です。それでも解決できそうです。何も見逃していない場合は、次の方法で対処できます。

  1. 「通常の」方法で現在の合計を計算します。つまり、null を無視します (実際には、null を 0 として扱います)。

  2. 前の結果セットから、Priceが null である行のみを選択し、現在の合計の現在の合計を計算します。

  3. 2 番目の結果セットから最も近い直前の「現在の現在の合計」を、最初のセットのすべての現在の合計に追加します。

これは上記の私の実装です:

WITH AllTotals AS (
  SELECT
    Id,
    Price,
    Total = SUM(Price) OVER (ORDER BY Id)
  FROM atable
)
, NullTotals AS (
  SELECT
    Id,
    Total = SUM(Total) OVER (ORDER BY Id)
  FROM AllTotals
  WHERE Price IS NULL
)
SELECT
  Id,
  Price,
  Total = Total + COALESCE((
    SELECT TOP (1) Total
    FROM NullTotals
    WHERE NullTotals.Id < AllTotals.Id
    ORDER BY Id DESC
  ), 0)
FROM AllTotals
;

このクエリは SQL Fiddle で試すことができます。

于 2013-03-01T18:28:16.343 に答える