日期:2014-05-18  浏览次数:20594 次

求解分类排序问题
数据库实例:

日期                             编号               项目
20070101       001 A
20070101     001 B
20070101     001 A
20070101     002 C
20070101     002 B
20070105     003 D
20070106     001 F
20070107     005 A
20070109     001 G
20070109     001 R
20070109     001 O
20070109     001 S

根据数据库中日期及编号生成ID编号(从0开始),希望结果如下:

日期     编号 ID 项目
20070101     001 0 A
20070101       001 1 B
20070101     001 2 A
20070101     002 0 C
20070101     002 1 B
20070105     003 0 D
20070106     001 0 F
20070107     005 0 A
20070109     001 0 G
20070109     001 1 R
20070109     001 2 O
20070109     001 3 S

------解决方案--------------------
--啊,早说啊

--没有主键要借助临时表

declare @Test table(日期 varchar(255),编号 varchar(255),项目 varchar(255))
insert @Test
select '20070101 ', '001 ', 'A ' union all
select '20070101 ', '001 ', 'B ' union all
select '20070101 ', '001 ', 'A ' union all
select '20070101 ', '002 ', 'C ' union all
select '20070101 ', '002 ', 'B ' union all
select '20070105 ', '003 ', 'D ' union all
select '20070106 ', '001 ', 'F ' union all
select '20070107 ', '005 ', 'A ' union all
select '20070109 ', '001 ', 'G ' union all
select '20070109 ', '001 ', 'R ' union all
select '20070109 ', '001 ', 'O ' union all
select '20070109 ', '001 ', 'S '

select OrderNo = identity(int, 1, 1), * into #Temp from @Test order by 日期, 编号

select
日期,
编号,
ID = (select sum(1)-1 from #Temp where 日期=a.日期 and 编号=a.编号 and OrderNo <=a.OrderNo),
项目
from #Temp a

/*

20070101 001 0 A
20070101 001 1 B
20070101 001 2 A
20070101 002 0 C
20070101 002 1 B
20070105 003 0 D
20070106 001 0 F
20070107 005 0 A
20070109 001 0 G
20070109 001 1 R
20070109 001 2 O
20070109 001 3 S

(所影响的行数为 12 行)

*/

drop table #Temp