パフォーマンスを向上させるためにカーソルをSQLで削除します(ベストプラクティスとベストプラクティスの使用方法をカーソルなしで設定する必要があるため)。とにかくcursur SQLステートメントを削除します
は、私はこのようになります一時テーブルを持っている:
DECLARE @Value INT
BEGIN
DECLARE c_Value CURSOR FOR
SELECT NR
FROM ##TMP
WHERE Value = 0
----
OPEN c_Value
FETCH NEXT FROM c_Value
INTO @Value
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Value = Value - Change
FROM ##TMP
WHERE NR = (Select MAX(NR) From ##TMP WHERE Value <> 0)
BEGIN
UPDATE ##TMP
SET Value = @Value
WHERE NR = (Select MAX(NR)+1 From ##TMP WHERE Value <> 0)
END
FETCH NEXT FROM c_Value
INTO @Value
END
CLOSE c_Value
DEALLOCATE c_Value
END
結果:
+------------+--------+-------+----+
| Period | Change | Value | NR |
+------------+--------+-------+----+
| 201705 | 7 | 26055 | 1 |
| 201704 | 29 | 26048 | 2 |
| 201703 | -92 | 26019 | 3 |
| 201702 | -338 | 26111 | 4 |
| 201701 | 81 | 26449 | 5 |
| 201612 | 107 | 26368 | 6 |
| 201611 | 72 | 26261 | 7 |
| 201610 | 54 | 26189 | 8 |
| 201609 | 64 | 26135 | 9 |
| 201608 | 47 | 26071 | 10 |
| 201607 | 23 | 26024 | 11 |
| 201606 | 45 | 26001 | 12 |
+------------+--------+-------+----+
をだから、どのように次のように
+------------+--------+-------+----+
| Period | Change | Value | NR |
+------------+--------+-------+----+
| 201705 | 7 | 26055 | 1 |
| 201704 | 29 | 0 | 2 |
| 201703 | -92 | 0 | 3 |
| 201702 | -338 | 0 | 4 |
| 201701 | 81 | 0 | 5 |
| 201612 | 107 | 0 | 6 |
| 201611 | 72 | 0 | 7 |
| 201610 | 54 | 0 | 8 |
| 201609 | 64 | 0 | 9 |
| 201608 | 47 | 0 | 10 |
| 201607 | 23 | 0 | 11 |
| 201606 | 45 | 0 | 12 |
+------------+--------+-------+----+
現在、カーソルが働きカーソルを使用せずにこの結果を達成することはできますか? CTEで試してみましたが、この結果は得られません。
これは、集合演算によって解決することはできませんが、あなたはそれを解決するために、相関サブクエリ、窓関数や再帰CTEを使用することができます。試したCTEを表示してください。そこから構築することができます。 – Jayvee
どのようなSQLバージョンですか? –
あなたはこの記事を見てください:https://msdn.microsoft.com/en-us/library/ms189461(v=sql.110).aspx – tgr