真金白银求一条SQL排序语句

在SQL Server数据库表中有一个"档号"字段,这个字段的值是这样子的:

档号

01·01-1
01·01-2
01·01-3
...
01·2007·01-1
01·2007·01-2
01·2007·01-3
......
01·2008·01-1
01·2008·01-2
01·2008·01-3
...
说明:
圆点-是软件盘点开以后选择9键生成的,它不是小数点;
减号-这个是普通减号
总之,数据大概就是上面这个样子的。前面是以圆点分隔,最后是以减号分隔。
现在要实现的排序就是跟上面的演示记录一样,每一段都按照从小到大排列起来。
相同分段最后的序号如果大于10,则9排完以后,接着是10、11这个样子的。

如有人能够帮助解决,本人愿付上人民币100元以上。有意者请留微信号详谈。

增加一个排序字段,数字类型,保存前面那个字段的计算值,比如01·01-1对应1000101,01·2008·01-2对应1200801,查询排序的时候查询新增的这个字段。

我记得mysql好像对字符串本身就有排序,排序规则是若第一个字符一样则比较第二个字段,若还一样则比较第三个字段,依次类推,直到比较出大小,比如你的
01·2008·01-1,和01·2008·01-2,在比较的时候先比较第一位都是0,则比较第二位都是1,第三位都是·依次类推直到最后一位1< 2,所以如果按照升序则01·2008·01-1排在01·2008·01-2前面,再比如abcd和accd比较,第一位都是a一样,第二位是b和c,在ASCII中明显b< c,所以abcd排在accd前面

在oracle、mysql中,直接根据字符就可以排序,可以达到你说的这种要求;
SQL:
select * from a order by no desc;

结果

SqlServer不知道是否可以直接使用上面方式,如果不同,可以下面SQL:
select * from a t order by cast(replace(replace(t.no, '·', ''), '-', '') as int) desc;

结果同上。

其中name是档号字段

 select *,substring(name,1,charindex('-',name)-1),
substring(name,charindex('-',name)+1,len(name)) from T1 order by 
substring(name,1,charindex('-',name)-1) asc,
convert(int,substring(name,charindex('-',name)+1,len(name))) asc

那是在写入数据的时候实现的吧,现在的问题是这个表是现成的,数据也是现成的,现在就是想在查询的时候,显示出正确的排序。

order by cast(PARSENAME(replace(replace(档号, '·' , ''),'-',''),1) as numeric(18,0)),
cast(PARSENAME(replace(replace(档号, '·' , ''),'-',''),2) as numeric(18,0)),
cast(PARSENAME(replace(replace(档号, '·' , ''),'-',''),3) as numeric(18,0)),
cast(PARSENAME(replace(replace(档号, '·' , ''),'-',''),4) as numeric(18,0)),
cast(PARSENAME(replace(replace(档号, '·' , ''),'-',''),5) as numeric(18,0)),
cast(PARSENAME(replace(replace(档号, '·' , ''),'-',''),6) as numeric(18,0))
以上是我的排序语句,但是最后的结果还是错误的。排到9的时候,就又开始显示其它的数据了,隔了不知多少以后,又从10开始显示。这就是问题的关键。

新建一个字段,然后写个方法遍历全表生成一遍新字段的值,并且在新的写入的时候也同时生成排序字段。

求解啊,我之前的排序语句到底什么地方出问题了啊?

各们大神,我现在的问题不是去新建一个字段,而是在现有的表中进行查询,也就是说,这个数据库的结构是不允许去动的.

SELECT 档号,
REPLACE(replace(档号,'.','a'),'-','b'), --把.替换成a,-替换成b
replace(ltrim(replace(REPLACE(replace(档号,'.','a'),'-','b'),'0',' ')),' ','0'), --把上一个替换结果去除左边的0
replace(replace(ltrim(replace(REPLACE(replace(档号,'.','a'),'-','b'),'0',' ')),' ','0'),'a0',0),--把上一个结果中a0替换成0
replace(replace(replace(ltrim(replace(REPLACE(replace(档号,'.','a'),'-','b'),'0',' ')),' ','0'),'a0',0),'b0',0),--把上一个结果中b0替换成0
replace(replace(replace(replace(ltrim(replace(REPLACE(replace(档号,'.','a'),'-','b'),'0',' ')),' ','0'),'a0',0),'b0',0),'a',0),--把上一个结果中a替换成0
convert(bigint,replace(replace(replace(replace(replace(ltrim(replace(REPLACE(replace(档号,'.','a'),'-','b'),'0',' ')),' ','0'),'a0',0),'b0',0),'a',0),'b',0) ) AS num--把上一个结果中b替换成0
FROM table
order BY num
以上的sql中的其他字段知识为了直观的显示,只需要select 档号 然后order by num就行了。最重要的就是num了