私は次の表を持っています
+-------+-------+----------+------+
| icode | iname | icatcode | slno |
+-------+-------+----------+------+
| 10 | a | 11 | 0 |
| 20 | b | 31 | 0 |
| 30 | c | 11 | 0 |
| 40 | d | 21 | 0 |
| 50 | e | 31 | 0 |
| 60 | f | 11 | 0 |
| 70 | g | 21 | 0 |
| 80 | h | 41 | 0 |
+-------+-------+----------+------+
カーソルを使用してslno列を更新する必要があります。o/p は次の表のようになります。つまり、icatcodeが同じ場合は slno をインクリメントし、icatcodeが変更された場合はslnoを 1 に設定する必要があります。
+-------+-------+----------+------+
| icode | iname | icatcode | slno |
+-------+-------+----------+------+
| 10 | a | 11 | 1 |
| 30 | b | 11 | 2 |
| 60 | c | 11 | 3 |
| 70 | d | 21 | 1 |
| 40 | e | 21 | 2 |
| 50 | f | 31 | 1 |
| 20 | g | 31 | 2 |
| 80 | h | 41 | 1 |
+-------+-------+----------+------+
私はそれのためのクエリを書きました
declare @icode int,@iccode int,@islno int,@inccode int
set @islno=1
declare cur2 cursor for select icode,iccode from im order by iccode
open cur2
fetch next from cur2 into @icode,@iccode
while @@FETCH_STATUS=0
begin
update im set slno=@islno where @icode=icode
fetch next from cur2 into @icode,@inccode
if @iccode<>@inccode
begin
set @islno=1
end
else
begin
set @islno=@islno+
end
end
close cur2
deallocate cur2
上記のクエリは、次の o/p を返します
+-------+-------+----------+------+
| icode | iname | icatcode | slno |
+-------+-------+----------+------+
| 10 | a | 11 | 1 |
| 20 | b | 31 | 1 |
| 30 | c | 11 | 2 |
| 40 | d | 21 | 1 |
| 50 | e | 31 | 1 |
| 60 | f | 11 | 3 |
| 70 | g | 21 | 1 |
| 80 | h | 41 | 1 |
+-------+-------+----------+------+
目的の o/p を取得するには、どのような変更を行う必要がありますか? カーソルを使用してのみこれを行う必要があります。