2017-03-07 72 views
-1

我需要梳理使用SQL查询 降序排序列一列我用正常的方法排序与字母数字数据说明奥德

Select * from StaffDetail order by SerialNo desc 

,但不能能得到预期的结果,样本数据用于排序下面给出

示例数据

Sample Data:

预期结果

Expected Result:

+1

哪些DBMS您使用的? Postgres的?甲骨文? –

+0

这些数字按字母顺序排列。你使用哪个dbms?一些产品具有数字敏感归类。 – jarlh

+0

您能否在样品数据和预期结果上添加BRB2017-6? – jarlh

回答

1

使用的LEFTRIGHTCHARINDEX字符串函数的组合只要分割字符串分为二。然后根据这两个值进行排序。

查询

select t.[Id], t.[SerialNo] from(
    select [Id], [SerialNo], 
    left([SerialNo], charindex(' - ', [SerialNo], 1) - 1) [new_col1], 
    right([SerialNo], charindex(' - ', reverse([SerialNo]), 1) - 1) [new_col2] 
    from [your_table_name] 
)t 
order by len(t.[new_col1]) desc, t.new_col1 desc, cast(t.[new_col2] as int) desc; 

您还可以更改order by条款一样,

order by len(t.[new_col1]) desc, t.[new_col1] desc, 
     len(t.[new_col2]) desc, t.[new_col2] desc; 

Find demo here

+0

兄弟,你错误地理解了我的问题'ASR2016 - 1'是一个单一的值。我添加了表格结构的图像。 –

+0

@ArunD:更新了答案 – Wanderer

+0

“将字符串拆分为两个”作品。谢谢兄弟 –

0
Select * from tableName order by columnName1 desc,SUBSTRING(columnName2,1)*1 desc 
+3

虽然这段代码可以解决这个问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的质量帖子。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – DimaSan