TSQL中的排序

TSQL中的排序,tsql,sql-server-2008,sorting,Tsql,Sql Server 2008,Sorting,我正在使用SQLServer2008 我想使用DetailRefNumber对结果进行排序。然而,我无法实现像这样的排序 2.1 2.2 2.3 xxx xxx 2.10 2.11 2.12 你能告诉我怎么做吗 谢谢。我从来没有试过,但是你能试着按顺序转换列吗 试试这个 SELECT ... FROM ... ORDER BY CAST(MyColumn AS Decimal(18,2)) 这项工作: CREATE TABLE #t ( mycol varchar(20)

我正在使用SQLServer2008

我想使用DetailRefNumber对结果进行排序。然而,我无法实现像这样的排序

2.1 
2.2 
2.3 
xxx
xxx
2.10
2.11
2.12
你能告诉我怎么做吗

谢谢。

我从来没有试过,但是你能试着按顺序转换列吗

试试这个

SELECT
 ...
FROM
...
ORDER BY
 CAST(MyColumn AS Decimal(18,2))
这项工作:

CREATE TABLE #t
 (
  mycol varchar(20)
 )

INSERT INTO #t(mycol) VALUES('1.0')
INSERT INTO #t(mycol) VALUES('1.10')
INSERT INTO #t(mycol) VALUES('2.10')
INSERT INTO #t(mycol) VALUES('21.20')
INSERT INTO #t(mycol) VALUES('2.00')

SELECT * FROM #t ORDER BY CAST(mycol as Decimal(18,2))

DROP TABLE #t

您的将成为:

SELECT
   AssessmentID,
   AssessmentRefNumber,
   DetailRefNumber
FROM 
   Assessments
ORDER BY
   CAST(DetailRefNumber As Decimal(18,2))
编辑 刚刚注意到“版本号排序”。 完全按照我所做的,将最后一部分改为使用substring/marc_发布的内容:

CREATE TABLE #t
 (
  mycol varchar(20)
 )

INSERT INTO #t(mycol) VALUES('1.0')
INSERT INTO #t(mycol) VALUES('1.2')
INSERT INTO #t(mycol) VALUES('1.11')
INSERT INTO #t(mycol) VALUES('2.10')
INSERT INTO #t(mycol) VALUES('21.20')
INSERT INTO #t(mycol) VALUES('2.20')
INSERT INTO #t(mycol) VALUES('2.00')
INSERT INTO #t(mycol) VALUES('2.11')
INSERT INTO #t(mycol) VALUES('2.2')

SELECT 
   * 
FROM #t 
ORDER BY 
  CAST(LEFT(mycol, CHARINDEX('.', myCol)-1) AS int), 
  CAST(SUBSTRING(myCol, CharINDEX('.', mycol)+1, 999) AS int)

您需要使用子字符串和强制转换

order by 
    CAST(SUBSTRING(DetailRefNumber, 0, 1) as int),
    CAST(SUBSTRING(DetailRefNumber, 2, LEN(DetailRefNumber) - 2) as int)

这将首先按小数点前的数字排序,然后按小数点后的数字排序,并将2.10视为大于2.3。

如果
DetailRefNumber
始终是一个数字,用点分隔,则可以向该表添加两个计算列,基本上将该列拆分为两个单独的列,数值:

alter table dbo.YourTable
  add RefNrMajor AS CAST(LEFT(DetailRefNumber, CHARINDEX('.', DetailRefNumber) - 1) AS INT) PERSISTED

alter table dbo.YourTable
  add RefNrMinor AS CAST(SUBSTRING(DetailRefNumber, CHARINDEX('.', DetailRefNumber) + 1, 999) AS INT) PERSISTED
现在您可以按这些新的数字列排序:

SELECT (columns)
FROM dbo.YourTable
ORDER BY RefNrMajor, RefNrMinor

您可以尝试
PARSENAME

ORDER BY CAST(PARSENAME(DetailRefNumber,2) AS INT),CAST(PARSENAME(DetailRefNumber,1) AS INT)

什么类型是DetailRefNumber?它的类型是什么?请不要说char/varchar/nvarchar@TTCG-我想是的…问题是为什么是varchar?你能解释一下你的排序顺序吗?因为它是没有意义的。@JNK想想版本号:1.1,1.2。。1.9、1.10、1.11..不起作用-尝试将
1.2
放在那里:应该出现在
1.0
之后,但在
1.10
之前,这将导致2.1和2.10被认为是等效的。。。2.3将在2.10之后结束。这是一个细节,重点是你可以使用CAST/CONVERT对元素进行排序,只需使用一个子字符串。好的,应该可以正常工作,我最初没有注意到版本号排序机制。这将强制表扫描,因为
子字符串
不是Sargablea,所以这假设“整数”是一位数字。当他们到达
10.1
10.2
等时会发生什么?我的意思是,这更多的是作为一个起点,而不是作为一个完整的拷贝粘贴解决方案。+1我没有注意到“版本”编号排序,所以这确实做到了。你试过了吗?像@Christian的回答一样,这也会在
2.3
之前错误地排序
2.10
无论
assessmentRefNum
是字符串还是数字。是的,我使用assessmentRefNum varchar(1)和detailRefNum varchar(5)运行它,值排序正确。我想发布一张图片,但因为我是新来的,所以我不能。谢谢大家的帮助。你们给了我很多不同的想法和知识。我非常感谢你的帮助和贡献。谢谢你。
ORDER BY CAST(PARSENAME(DetailRefNumber,2) AS INT),CAST(PARSENAME(DetailRefNumber,1) AS INT)