在SQL查询中按升序排序

时间:2015-07-22 08:49:54

标签: sql-server sorting


我在表中有一个varchar字段select,其中包含此格式的数据,例如。

CC/11/2015
CC/12/2015
FA/11/2014
FA/12/2014
FA/11/2015
FA/12/2015

我想以下列方式对{{1}}查询的结果进行排序

{{1}}

首先它应该按字母顺序排序前两个字符。 然后按升序排列的剩余数字和结果应如上所述。
注意: - 数据的最后部分是年份,但中间部分不是一个月,它只是一个数字 这样做是否可行。
感谢

4 个答案:

答案 0 :(得分:3)

这可能是您正在寻找的:

select * from table1 
order by left(col1, 2), convert(date, '01/' + substring(col1, 4, 7), 103) 

我的假设是最后一部分是月份+年,但当然也可能是其他部分。

答案 1 :(得分:2)

你必须这样做:

    select * from temp
    order by 
    left(columnA,2) asc ,
    right(columnA,4) asc,      
    cast(replace(replace(columnA,left(columnA,3),''),right(columnA,5),'') as int) asc

这里有一个DEMO! 所以你编辑了帖子,这应该工作得很好。这不是将日期转换为字符串的最后一部分

答案 2 :(得分:1)

试试这个order by。更通用的方法

ORDER  BY LEFT ('FA/12/2014', Charindex('/', 'FA/12/2014') - 1),
          Cast('01'+ Substring('FA/12/2014', Charindex('/', 'FA/12/2014'), 8) AS DATE) 

<强>样本

SELECT *
FROM   (VALUES ('CC/11/2015'),
               ('CC/12/2015'),
               ('FA/11/2014'),
               ('FA/12/2014'),
               ('FA/11/2015'),
               ('FA/12/2015')) tc (dates)
ORDER  BY LEFT (dates, Charindex('/', dates) - 1),
          Cast('01'
               + Substring(dates, Charindex('/', dates), 8) AS DATE) 

结果:

dates
----------
CC/11/2015
CC/12/2015
FA/11/2014
FA/12/2014
FA/11/2015
FA/12/2015

答案 3 :(得分:0)

我认为你可以在这种情况下使用PARSENAME

SELECT *
FROM   #Your_Table
ORDER  BY Parsename(Replace(columnA, '/', '.'), 3),
          Parsename(Replace(columnA, '/', '.'), 1),
          Parsename(Replace(columnA, '/', '.'), 2)