TSQL中的排序
我正在使用SQLServer2008 我想使用DetailRefNumber对结果进行排序。然而,我无法实现像这样的排序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)
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)