1

wrntybank_table に次のデータ セットがあります。

doc_no   doc_lineno  stk_code  stk_lineno  serial_no  warranty_no
doc1        NULL        ABC         NULL      ABC1       WRN1
doc1        NULL        ABC         NULL      ABC5       WRN5
doc1        NULL        DEF         NULL      ABC2       WRN2
doc2        NULL        ABC         NULL      ABC3       WRN3
doc4        NULL        HJI         NULL      ABC4       WRN4
doc4        NULL        HJI         NULL      ABC6       WRN6

このテーブルを更新し、doc_lineno & stk_lineno 列を次のように数値で埋めたいと思います。

doc_no   doc_lineno  stk_code  stk_lineno  serial_no  warranty_no
doc1        1        ABC         1      ABC1           WRN1
doc1        1        ABC         2      ABC5           WRN5
doc1        2        DEF         1      ABC2           WRN2
doc2        1        ABC         1      ABC3           WRN3
doc4        1        HJI         1      ABC4           WRN4
doc4        1        HJI         2      ABC6           WRN6

両方の列にこのコードを使用して作成する方法。

with toupdate as (
          select Document,
                 10 * row_number() over (partition by Document order by (select NULL)) as val
          from t
         )
update toupdate
    set line_num = val;

注: doc_lineno の場合、同じ doc_no 内の同じ stk_code の番号は同じままで、stk_code と doc_no でリセットされます。stk_lineno の場合、数値は diff 時にリセットされます。stk_code

4

1 に答える 1

2

テーブルには、各行を識別する ID 列があると仮定します。

with cte (id, dln, sln)
as
(
   select id, dense_rank() over (partition by doc_no order by stk_code asc) as dln
      , row_number() over (partition by doc_no, stk_code order by serial_no asc) as sln
   from @t_test
)
update @t_test
set doc_lineno = cte.dln
   , stk_lineno = cte.sln
from @t_test as t
inner join cte as cte
on t.id = cte.id
;
于 2013-10-28T07:14:37.143 に答える