MS-SQL中,tb表数据如下:
id productname
1 10mm圆板
2 27mm柜身板
3 TB10mm圆板
4 18mm柜身板
5 10mm柜身板
6 TB18mm柜身板
7 TB10mm柜身板
8 TB27mm内侧板
9 10mm底板如何写一条SQL查询语句,让这些数据按板的厚度按如下方式排序呢?意思说,将厚度一样的排在一起,并按小到大排。
难点是,有些板的厚度前加了TB这种情况。
9 10mm底板
5 10mm柜身板
1 10mm圆板
7 TB10mm柜身板
3 TB10mm圆板
4 18mm柜身板
6 TB18mm柜身板
2 27mm柜身板
8 TB27mm内侧板
id productname
1 10mm圆板
2 27mm柜身板
3 TB10mm圆板
4 18mm柜身板
5 10mm柜身板
6 TB18mm柜身板
7 TB10mm柜身板
8 TB27mm内侧板
9 10mm底板如何写一条SQL查询语句,让这些数据按板的厚度按如下方式排序呢?意思说,将厚度一样的排在一起,并按小到大排。
难点是,有些板的厚度前加了TB这种情况。
9 10mm底板
5 10mm柜身板
1 10mm圆板
7 TB10mm柜身板
3 TB10mm圆板
4 18mm柜身板
6 TB18mm柜身板
2 27mm柜身板
8 TB27mm内侧板
order by
substring(productname,patindex('%[0-9]%',productname)-patindex('%[吖-做]%',productname)-1)
order by
cast(substring(productname,patindex('%[0-9]%',productname)-patindex('%[吖-做]%',productname)-3) as int)
order by
cast(substring(productname,
patindex('%[0-9]%',productname),
patindex('%[吖-做]%',productname)-patindex('%[0-9]%',productname)-2
)
as int
)
再改改
select * from tb
order by right(productname,len(productname) - patindex('%[0-9]%',productname)+1), productname;
9 10mm底板
5 10mm柜身板
7 TB10mm柜身板
1 10mm圆板
3 TB10mm圆板
4 18mm柜身板
6 TB18mm柜身板
2 27mm柜身板
8 TB27mm内侧板
这要样的话,10mm的板不排在一起了。我想将TB的板也排在一起。
-- Author: flystone
-- Version:V1.001
-- Date:2009-09-16 22:31:15
-------------------------------------- Test Data: ta
If object_id('ta') is not null
Drop table ta
Go
Create table ta(id int,productname nvarchar(9))
Go
Insert into ta
select 1,'10mm圆板' union all
select 2,'27mm柜身板' union all
select 3,'TB10mm圆板' union all
select 4,'18mm柜身板' union all
select 5,'10mm柜身板' union all
select 6,'TB18mm柜身板' union all
select 7,'TB10mm柜身板' union all
select 8,'TB27mm内侧板' union all
select 9,'10mm底板'
Go
--Start
Select * ,patindex('%[^a-zA-Z0-9]%',productname)
from ta
order by replace(left(productname,patindex('%[^a-zA-Z0-9]%',productname)-1),'TB',''),case when left(productname,2) = 'TB' then 1 else 0 end,id desc--Result:
/*
id productname
----------- ----------- -----------
9 10mm底板 5
5 10mm柜身板 5
1 10mm圆板 5
7 TB10mm柜身板 7
3 TB10mm圆板 7
4 18mm柜身板 5
6 TB18mm柜身板 7
2 27mm柜身板 5
8 TB27mm内侧板 7(所影响的行数为 9 行)*/
--End
If object_id('ta') is not null
Drop table ta
Go
Create table ta(id int,productname nvarchar(9))
Go
Insert into ta
select 1,'10mm圆板' union all
select 2,'27mm柜身板' union all
select 3,'TB10mm圆板' union all
select 4,'18mm柜身板' union all
select 5,'10mm柜身板' union all
select 6,'TB18mm柜身板' union all
select 7,'TB10mm柜身板' union all
select 8,'TB27mm内侧板' union all
select 9,'10mm底板'
Goselect *,
(rank() over (partition by substring(productname,patindex('%[0-9]%',productname),2) order by productname))as rank
from ta
--假设厚度都是两位数字
不过表的设计不太好,加一个规格的字段就不会出现楼主的困惑了