1

SQL Server 2012を実行していますが、必要なものは次のとおりです。

Row      Field1          Field2
 1         0               1
 2         ?               2
 3         ?               -5

行ごとにスローするクエリが必要です。row2、field1を取り、row1、field1 + row2、field2と等しくなるように設定する必要があります

次に、row3、field1を取得し、row2、field1 + row3、field2と等しくなるように設定します。

最初、テーブルのField1の値はすべて0に等しいため、クエリを実行すると、field1の値に常に0が使用されます。

どんな助けでもいただければ幸いです。私はCTEが進むべき道だと思っていましたが、それをどこに行けばいいのかわかりません。

編集:私の例では、いくつかのことを片付けるためだけに。初期入力は次のようになります

Row      Field1          Field2
 1         0               1
 2         0               2
 3         0               -5

必要な出力は次のとおりです。

Row      Field1          Field2
 1         1               1
 2         3               2
 3         -2               -5 

私の実際のテーブルは少し複雑ですが、この例でそれを実行する方法を理解できれば、具体的に適用できることはわかっています。

4

2 に答える 2

3

これはあなたが必要なものですか?(たとえば、row2、field1を参照するときに、更新前または更新後の値を意味するかどうかは不明です)

CREATE TABLE YourTable
  (
     Row    INT,
     Field1 INT NULL,
     Field2 INT
  )

INSERT INTO YourTable
VALUES      (1,0,1),
            (2,0,2),
            (3,0,-5); 
WITH CTE AS
(
SELECT *,
       SUM(Field2) OVER (ORDER BY Row ROWS UNBOUNDED PRECEDING) AS RunningTotal
FROM  YourTable    
)
UPDATE CTE 
SET Field1 = RunningTotal

SELECT *
FROM YourTable

最終結果

Row         Field1      Field2
----------- ----------- -----------
1           1           1
2           3           2
3           -2          -5

またはあなたの文章題の別の(より文字通りの)解釈は

WITH CTE AS
(
SELECT *,
       LAG(Field2) OVER (ORDER BY Row) AS PrevRowField2
FROM  YourTable    
)
UPDATE CTE 
SET Field1 = PrevRowField2 + Field1
WHERE PrevRowField2 IS NOT NULL
于 2012-12-23T21:57:54.983 に答える
1

このようなものをTSQLから適応させた再帰的な更新?

With cte As (
  Select
    Row, 
    Field1, 
    Field2
  From
    t
  Where
    Row = 1
  Union All
  Select
    t.Row,
    t.Field2 + c.Field1,
    t.Field2
  From
    t
      Inner Join
    cte c
      On t.Row = c.Row + 1
)
Update
  t
Set
  Field1 = c.Field1
From
  t
    inner join
  cte c
    On t.Row = c.Row

http://sqlfiddle.com/#!6/cf843/1

于 2012-12-23T21:58:02.340 に答える