您的位置:程序门 -> ms-sql server -> 应用实例



求解分类排序问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


求解分类排序问题[已结贴,结贴人:yclxw]
发表于:2007-08-28 19:47:20 楼主
数据库实例:

日期                             编号               项目
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
发表于:2007-08-28 19:52:331楼 得分:0
select   *   from   <表名>
order   by   日期,编号,id,项目

它自然按照order   by     后面的字段名的先后排序
发表于:2007-08-28 20:02:242楼 得分:0
比较有挑战性,我试下。
发表于:2007-08-28 20:07:293楼 得分:0
id是要求的,表中本来是没有id列。
发表于:2007-08-28 20:12:064楼 得分:0
有没有主键?
发表于:2007-08-28 20:17:035楼 得分:0
有主键
发表于:2007-08-28 20:19:136楼 得分:30
--啊,早说啊

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

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
发表于:2007-08-28 20:22:247楼 得分:0
谢谢!!
发表于:2007-08-28 20:23:088楼 得分:0
select
日期,
编号,
id   =   (select   sum(1)-1   from   #temp   where   日期=a.日期   and   编号=a.编号   and   orderno <=a.orderno),
项目
from   #temp   a

/*
有主键就把“orderno <=a.orderno”换成“主键 <=a.主键”,#temp换成实际表即可。
*/


快速检索

最新资讯
热门点击