又是排序问题...SQL2000...

dingpin 2011-02-24 03:50:38
ID PID BID
1 [2010]001 豫勘测评备字[2010]1号
2 [2010]002 豫勘测评备字[2010]2号
3 [2010]003 豫勘测评不备字[2010]1号
4 [2010]003-1 豫勘测评备字[2010]3号
5 [2010]004 豫勘测评不备字[2010]2号
6 [2010]005 豫勘测评备字[2010]4号
...
7 [2010]006 豫勘测评备字[2010]12号
8 [2010]007 豫勘测评备字[2010]63号
9 [2010]008 豫勘测评备字[2010]259号
10 [2010]009 豫勘测评不备字[2010]23号
11 [2010]010 豫勘测评不备字[2010]211号
...
12 [2011]001 豫勘测评备字[2011]1号
13 [2011]002 豫勘测评备字[2011]2号
14 [2011]003 豫勘测评备字[2011]3号
15 [2011]004 豫勘测评不备字[2011]1号
...
16 [2011]004-1 豫勘测评备字[2011]16号
17 [2011]005 豫勘测评不备字[2011]2号
18 [2011]006 豫勘测评备字[2011]29号
19 [2011]007 豫勘测评备字[2011]123号
20 [2011]008 豫勘测评不备字[2011]12号
21 [2011]008-1 豫勘测评备字[2011]235号
22 [2011]009 豫勘测评不备字[2011]36号
23 [2011]010 豫勘测评不备字[2011]121号
24 [2011]011 豫勘测评不备字[2011]222号
25 [2011]012 豫勘测评备字[2011]369号

如上:在SQL2000里面的表数据,
要求按BID排序,首先按年份排,2011在前,然后备字的在不备字的前面

出来后是这样的...

12 [2011]001 豫勘测评备字[2011]1号
13 [2011]002 豫勘测评备字[2011]2号
14 [2011]003 豫勘测评备字[2011]3号
...
15 [2011]004 豫勘测评不备字[2011]1号
17 [2011]005 豫勘测评不备字[2011]2号
...

1 [2010]001 豫勘测评备字[2010]1号
2 [2010]002 豫勘测评备字[2010]2号
4 [2010]003-1 豫勘测评备字[2010]3号
6 [2010]005 豫勘测评备字[2010]4号
...
3 [2010]003 豫勘测评不备字[2010]1号
5 [2010]004 豫勘测评不备字[2010]2号
...


由于字符串长度不一样,所以我在想把这个列分割一下,然后再排序

豫勘测评 备字[2010] 1 号
豫勘测评 不备字[2010] 1 号

分成四列,一列和四列数据一样,忽略不计,只排二列和三列,然后在出结果的时候再加上一列和四列和字符

...


...全文
118 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
AcHerat 2011-02-25
  • 打赏
  • 举报
回复

select *
from tb
order by left(stuff(pid,1,1,''),4) desc,(case when charindex('不备',bid) > 0 then 1 else 0 end),right(pid,len(pid)-6),id
dingpin 2011-02-25
  • 打赏
  • 举报
回复
期待高手指点...
王向飞 2011-02-25
  • 打赏
  • 举报
回复
再加一个
order by  ***********,stuff(pid,1,charindex(']',bid),'')
dingpin 2011-02-25
  • 打赏
  • 举报
回复
4楼的,差不多可以了,但就是最后那个号的问题没解决

豫勘测评备字[2011]1号
豫勘测评备字[2011]12号
豫勘测评备字[2011]123号
豫勘测评备字[2010]2
豫勘测评不备字[2011]1号
豫勘测评不备字[2011]12号
豫勘测评不备字[2011]123号
豫勘测评不备字[2010]2

最后那个号,不是固定一位,而是1到位,不定的

还有就是最后那个号字,可以不要的,是不是就好排序一些呢?
SQL77 2011-02-25
  • 打赏
  • 举报
回复
还可以考虑用PARSENAME(REPLACE(BID,‘[’,‘。’)来处理
SQL77 2011-02-25
  • 打赏
  • 举报
回复
if not object_id('tb') is null
drop table tb
Go

Create table tb(id int,pid char(20),bid varchar(30))
insert into tb

select 1,'[2010]001','豫勘测评备字[2010]2号' union all
select 2,'[2010]002','豫勘测评备字[2010]12号' union all
select 3,'[2010]003','豫勘测评不备字[2010]3号' union all
select 4,'[2010]003-1','豫勘测评备字[2010]1号' union all
select 5,'[2010]004','豫勘测评不备字[2010]21号' union all
select 6,'[2010]005','豫勘测评备字[2010]4号' union all

select 7,'[2010]006','豫勘测评备字[2010]12号' union all
select 8,'[2010]007','豫勘测评备字[2010]63号' union all
select 9,'[2010]008','豫勘测评备字[2010]259号' union all
select 10,'[2010]009','豫勘测评不备字[2010]23号' union all
select 11,'[2010]010','豫勘测评不备字[2010]211号' union all

select 12,'[2011]001','豫勘测评备字[2011]1号' union all
select 13,'[2011]002','豫勘测评备字[2011]2号' union all
select 14,'[2011]003','豫勘测评备字[2011]3号' union all
select 15,'[2011]004','豫勘测评不备字[2011]1号' union all

select 16,'[2011]004-1','豫勘测评备字[2011]16号' union all
select 17,'[2011]005','豫勘测评不备字[2011]2号' union all
select 18,'[2011]006','豫勘测评备字[2011]29号' union all
select 19,'[2011]007','豫勘测评备字[2011]123号' union all
select 20,'[2011]008','豫勘测评不备字[2011]12号' union all
select 21,'[2011]008-1','豫勘测评备字[2011]235号' union all
select 22,'[2011]009','豫勘测评不备字[2011]36号' union all
select 23,'[2011]010','豫勘测评不备字[2011]121号' union all
select 24,'[2011]011','豫勘测评不备字[2011]222号' union all
select 25,'[2011]012','豫勘测评备字[2011]369号'

go

SELECT * FROM TB
ORDER BY
CASE WHEN CHARINDEX('不',BID)>0 THEN 1 ELSE 0 END,
SUBSTRING(BID,CHARINDEX('[',BID)+1,CHARINDEX(']',BID)-CHARINDEX('[',BID)-1)*1,
REPLACE(SUBSTRING(BID,CHARINDEX(']',BID)+1,LEN(BID)-CHARINDEX('[',BID)-1),'号','')*1


/*
(所影响的行数为 25 行)

id pid bid
----------- -------------------- ------------------------------
4 [2010]003-1 豫勘测评备字[2010]1号
1 [2010]001 豫勘测评备字[2010]2号
6 [2010]005 豫勘测评备字[2010]4号
7 [2010]006 豫勘测评备字[2010]12号
2 [2010]002 豫勘测评备字[2010]12号
8 [2010]007 豫勘测评备字[2010]63号
9 [2010]008 豫勘测评备字[2010]259号
12 [2011]001 豫勘测评备字[2011]1号
13 [2011]002 豫勘测评备字[2011]2号
14 [2011]003 豫勘测评备字[2011]3号
16 [2011]004-1 豫勘测评备字[2011]16号
18 [2011]006 豫勘测评备字[2011]29号
19 [2011]007 豫勘测评备字[2011]123号
21 [2011]008-1 豫勘测评备字[2011]235号
25 [2011]012 豫勘测评备字[2011]369号
3 [2010]003 豫勘测评不备字[2010]3号
5 [2010]004 豫勘测评不备字[2010]21号
10 [2010]009 豫勘测评不备字[2010]23号
11 [2010]010 豫勘测评不备字[2010]211号
15 [2011]004 豫勘测评不备字[2011]1号
17 [2011]005 豫勘测评不备字[2011]2号
20 [2011]008 豫勘测评不备字[2011]12号
22 [2011]009 豫勘测评不备字[2011]36号
23 [2011]010 豫勘测评不备字[2011]121号
24 [2011]011 豫勘测评不备字[2011]222号

(所影响的行数为 25 行)
快溜 2011-02-25
  • 打赏
  • 举报
回复
 select * from tb
order by left(right(BID,len(BID)-charindex('[',BID)+1),6) desc,
(case when charindex('不备',bid) > 0 then 1 else 0 end),
cast(right(left(bid,len(bid)-1),len(BID)-charindex(']',BID)-1) as int)
dingpin 2011-02-25
  • 打赏
  • 举报
回复
if not object_id('tb') is null
drop table tb
Go

Create table tb(id int,pid char(20),bid varchar(30))
insert into tb

select 1,'[2010]001','豫勘测评备字[2010]2号' union all
select 2,'[2010]002','豫勘测评备字[2010]12号' union all
select 3,'[2010]003','豫勘测评不备字[2010]3号' union all
select 4,'[2010]003-1','豫勘测评备字[2010]1号' union all
select 5,'[2010]004','豫勘测评不备字[2010]21号' union all
select 6,'[2010]005','豫勘测评备字[2010]4号' union all

select 7,'[2010]006','豫勘测评备字[2010]12号' union all
select 8,'[2010]007','豫勘测评备字[2010]63号' union all
select 9,'[2010]008','豫勘测评备字[2010]259号' union all
select 10,'[2010]009','豫勘测评不备字[2010]23号' union all
select 11,'[2010]010','豫勘测评不备字[2010]211号' union all

select 12,'[2011]001','豫勘测评备字[2011]1号' union all
select 13,'[2011]002','豫勘测评备字[2011]2号' union all
select 14,'[2011]003','豫勘测评备字[2011]3号' union all
select 15,'[2011]004','豫勘测评不备字[2011]1号' union all

select 16,'[2011]004-1','豫勘测评备字[2011]16号' union all
select 17,'[2011]005','豫勘测评不备字[2011]2号' union all
select 18,'[2011]006','豫勘测评备字[2011]29号' union all
select 19,'[2011]007','豫勘测评备字[2011]123号' union all
select 20,'[2011]008','豫勘测评不备字[2011]12号' union all
select 21,'[2011]008-1','豫勘测评备字[2011]235号' union all
select 22,'[2011]009','豫勘测评不备字[2011]36号' union all
select 23,'[2011]010','豫勘测评不备字[2011]121号' union all
select 24,'[2011]011','豫勘测评不备字[2011]222号' union all
select 25,'[2011]012','豫勘测评备字[2011]369号

go


需要的结果是这样的,其他列不管是什么顺序,关键是这列

豫勘测评备字[2011]1号
豫勘测评备字[2011]2号
豫勘测评备字[2011]3号
...
豫勘测评备字[2011]12号
豫勘测评备字[2011]223号
...

豫勘测评不备字[2011]1号
豫勘测评不备字[2011]2号
豫勘测评不备字[2011]3号
豫勘测评不备字[2011]12号
豫勘测评不备字[2011]22号
豫勘测评不备字[2011]122号
...
豫勘测评备字[2010]1号
豫勘测评备字[2010]2号
豫勘测评备字[2010]13号
豫勘测评备字[2010]41号
豫勘测评备字[2010]121号
...
豫勘测评不备字[2010]1号
豫勘测评不备字[2010]2号
豫勘测评不备字[2010]11号
豫勘测评不备字[2010]22号
豫勘测评不备字[2010]121号
豫勘测评不备字[2010]222号
dingpin 2011-02-25
  • 打赏
  • 举报
回复
楼上的不行啊
AcHerat 2011-02-24
  • 打赏
  • 举报
回复

create table tb(id int,pid char(20),bid varchar(30))
insert into tb
select 1,'[2010]001','豫勘测评不备字[2010]1号' union all
select 2,'[2010]001','豫勘测评备字[2010]1号' union all
select 3,'[2010]001','豫勘测评备字[2010]1号' union all
select 4,'[2010]001','豫勘测评不备字[2010]1号' union all
select 5,'[2010]001','豫勘测评备字[2010]1号' union all
select 6,'[2010]001','豫勘测评不备字[2010]1号' union all
select 16,'[2011]004-1','豫勘测评备字[2011]1号' union all
select 17,'[2011]005','豫勘测评不备字[2011]1号' union all
select 18,'[2011]006','豫勘测评备字[2011]1号' union all
select 19,'[2011]007','豫勘测评备字[2011]1号' union all
select 20,'[2011]008','豫勘测评不备字[2011]1号'
go

select *
from tb
order by left(stuff(pid,1,1,''),4) desc,(case when charindex('不备',bid) > 0 then 1 else 0 end),right(pid,len(pid)-6)

drop table tb


id pid bid
----------- -------------------- ------------------------------
16 [2011]004-1 豫勘测评备字[2011]1号
18 [2011]006 豫勘测评备字[2011]1号
19 [2011]007 豫勘测评备字[2011]1号
20 [2011]008 豫勘测评不备字[2011]1号
17 [2011]005 豫勘测评不备字[2011]1号
2 [2010]001 豫勘测评备字[2010]1号
3 [2010]001 豫勘测评备字[2010]1号
5 [2010]001 豫勘测评备字[2010]1号
6 [2010]001 豫勘测评不备字[2010]1号
4 [2010]001 豫勘测评不备字[2010]1号
1 [2010]001 豫勘测评不备字[2010]1号

(11 行受影响)
快溜 2011-02-24
  • 打赏
  • 举报
回复
 create table tb(id int,pid char(20),bid varchar(30))
insert into tb
select 1,'[2010]001','豫勘测评不备字[2010]1号' union all
select 2,'[2010]001','豫勘测评备字[2010]1号' union all
select 3,'[2010]001','豫勘测评备字[2010]1号' union all
select 4,'[2010]001','豫勘测评不备字[2010]1号' union all
select 5,'[2010]001','豫勘测评备字[2010]1号' union all
select 6,'[2010]001','豫勘测评不备字[2010]1号' union all
select 16,'[2011]004-1','豫勘测评备字[2011]1号' union all
select 17,'[2011]005','豫勘测评不备字[2011]1号' union all
select 18,'[2011]006','豫勘测评备字[2011]1号' union all
select 19,'[2011]007','豫勘测评备字[2011]1号' union all
select 20,'[2011]008','豫勘测评不备字[2011]1号'


select * from tb
order by left(right(BID,len(BID)-charindex('[',BID)+1),6) desc,
(case when charindex('不备',bid) > 0 then 1 else 0 end),id

/*

id pid bid
----------- -------------------- ------------------------------
16 [2011]004-1 豫勘测评备字[2011]1号
18 [2011]006 豫勘测评备字[2011]1号
19 [2011]007 豫勘测评备字[2011]1号
17 [2011]005 豫勘测评不备字[2011]1号
20 [2011]008 豫勘测评不备字[2011]1号
2 [2010]001 豫勘测评备字[2010]1号
3 [2010]001 豫勘测评备字[2010]1号
5 [2010]001 豫勘测评备字[2010]1号
1 [2010]001 豫勘测评不备字[2010]1号
4 [2010]001 豫勘测评不备字[2010]1号
6 [2010]001 豫勘测评不备字[2010]1号
dingpin 2011-02-24
  • 打赏
  • 举报
回复
谢谢,我去试试先...
快溜 2011-02-24
  • 打赏
  • 举报
回复
 select * from tb
order by left(right(BID,len(BID)-charindex('[',BID)),6) desc,
case when charindex('不备',bid) > 0 then 1 else 0 end),BID
AcHerat 2011-02-24
  • 打赏
  • 举报
回复

select *
from tb
order by left(stuff(pid,1,1,''),4),(case when charindex('不备',bid) > 0 then 1 else 0 end),right(pid,len(pid)-6)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧