我需要一些sql
查询的帮助,但我无法解决这个问题。我需要按编号依次订购这些值。
有任何建议怎么做?
我正在处理Sql Server 2014
,但我认为这无关紧要。
Cod_Turma Turma
1 11-A
2 11-F
3 10-F
4 11-G
5 11-I
6 10-E
7 12-L
8 10-J
9 7-B
10 9-B
11 7-E
12 7-D
13 12-H
输出应为:
Cod_Turma Turma
9 7-B
12 7-D
11 7-E
10 9-B
...
答案 0 :(得分:5)
可能的解决方案:
SELECT * FROM TableName
ORDER BY CAST(LEFT(Turma, CHARINDEX('-', Turma) - 1) AS INT), --left part
SUBSTRING(Turma, CHARINDEX('-', turma), LEN(turma)) --right part
答案 1 :(得分:4)
DECLARE @t table (cod_turma int, turma varchar(10));
INSERT @t values
(1,'11-A')
,(2,'11-F')
,(3,'10-F')
,(4,'11-G')
,(5,'11-I')
,(6,'10-E')
,(7,'12-L')
,(8,'10-J')
,(9,'7-B' )
,(10,'9-B')
,(11,'7-E')
,(12,'7-D')
,(13,'12-H')
SELECT * FROM @t
ORDER BY CAST(LEFT(Turma, CHARINDEX('-', Turma)-1) AS INT), SUBSTRING(turma, CHARINDEX('-', Turma), 1000)
说明:将Turma分解为两个单独的值(int和字符);将int部分转换为int(这样你就不会得到1, 10, 2, 20, 3, 31
的排序)并按顺序排序,然后按字母部分排序。
我已对此进行了编辑,以反映@Giorgi Nakeuri的帖子所提出的改进以及@TimSchemlter的评论。 (注意:我的初始帖子不起作用,我试图从时髦开始使用一些不正确的语法。)
答案 2 :(得分:0)
答案 3 :(得分:0)
我认为Dan和Giorgi的答案都很好,但是出于各种各样的考虑,这里有一个使用PARSENAME()技巧的替代方法。
SELECT Cod_Turma,
Turma
FROM @yourTable
CROSS APPLY(SELECT REPLACE(Turma,'-','.')) CA(par)
ORDER BY CAST(PARSENAME(par,2) AS INT),PARSENAME(par,1)
答案 4 :(得分:-2)
按升序排序将首先按数字排序,然后按字母排序。 从Turma asc
中选择TableXX的Cod_Turma,Turma