2013-08-27 28 views
1

我想将增量计数添加到2个单独的字段。 我在同一个表FieldAFieldB,需要增加作为示例 -同时循环2个字段上的同一个表

FieldA | ID1 | FieldB | ID2 
ABC | 1 | GREEN | 2 
ABC | 1 | RED | 3 
ABC | 1 | Yellow | 4 
XYZ | 5 | RED | 6 
DEF | 7 | GREEN | 8 
DEF | 7 | BLUE | 9 

如果没有号码被复制,除了FieldAFieldA将根据最后的FIELDB递增。

+0

在你的T-SQL代码中使用'CURSOR'你快乐吗实现这一目标? –

+0

我将如何使用光标实现此目标? – Tony

回答

0

似乎有点傻没有一些ROWNUMBER。我装着ROWNUMBER这我不是在我的查询显示:

;with a as 
(
select row_number() over (order by (select 1)) rn, FieldA, FieldB 
from 
-- replace next row with your table 
(values('ABC', 'GREEN'),('ABC', 'RED'),('ABC', 'Yellow'),('XYZ', 'RED'),('DEF', 'GREEN'),('DEF', 'BLUE')) t(FieldA, FieldB) 
), b as 
(
select rn - dense_rank() over (partition by fieldA order by rn) calc, rn, FieldA, FieldB from a 
), c as 
(
select FieldA, 
calc+ dense_rank() over (order by calc) ID1, 
FieldB, 
rn + dense_rank() over (order by calc) ID2 from b 
) 
select * from c 

结果:

FieldA ID1 FieldB ID2 
ABC  1 GREEN 2 
ABC  1 RED  3 
ABC  1 Yellow 4 
XYZ  5 RED  6 
DEF  7 GREEN 8 
DEF  7 BLUE 9 
+0

如果我想从我的表中订购数据,我将如何订购FieldA和FieldB? – Tony

+0

@Tony如果你想按FieldA排序,并且FieldB将第一个'row_number()...'替换为'FieldA,FieldB排序选择row_number()''''' –

+0

这工作完美,我非常感谢帮助。 – Tony

0

对我来说相当神秘,它在哪里会有用。然而:

declare @table table (FieldA varchar(50), FieldB varchar(50)) 
insert into @table values 
    ('ABC','GREEN') 
    ,('ABC','RED') 
    ,('ABC','Yellow') 
    ,('XYZ','RED') 
    ,('DEF','GREEN') 
    ,('DEF','BLUE') 

;with [1](fa) as (select distinct FieldA from @table), 
[2](fa, id1) as (select fa, row_number() over (order by fa) from [1]), 
[3](fa, fb, id2) as (select FieldA, FieldB, row_number() over (partition by FieldA order by FieldB) from @table), 
[4](id1, id2, fa, fb, p) as (
    select NULL, id1, fa, NULL, cast(id1 as binary(4)) from [2] 
    union all 
    select [2].id1, [3].id2, [2].fa, [3].fb, cast([2].id1 as binary(4)) + cast([3].id2 as binary(4)) 
    from [2] join [3] on [3].fa = [2].fa), 
[5] as (select id1, id2, fa, fb, rn=row_number() over (order by p) from [4]) 
select t.FieldA, [6].rn as ID1, t.FieldB, [7].rn as ID2 
from @table t 
    join [5] [6] on [6].fa = t.FieldA and [6].fb is NULL 
    join [5] [7] on [7].fa = t.FieldA and [7].fb = t.FieldB 

输出是(完全按照您指定的不是,但它不能确切没有一些标识进行排序):

FieldA ID1 FieldB ID2 
-------- ---- -------- ----- 
ABC  1 GREEN 2 
ABC  1 RED  3 
ABC  1 Yellow 4 
DEF  5 BLUE  6 
DEF  5 GREEN 7 
XYZ  8 RED  9 
+0

这对于将增量数字添加到x12 837提取中的HL段非常有用。 – Tony

相关问题