我正在使用SQL Server 2008.排序在TSQL
我想通過使用DetailRefNumber排序我的結果。然而,我無法實現像
2.1
2.2
2.3
xxx
xxx
2.10
2.11
2.12
請你指導我如何做到這一點?
謝謝。
我正在使用SQL Server 2008.排序在TSQL
我想通過使用DetailRefNumber排序我的結果。然而,我無法實現像
2.1
2.2
2.3
xxx
xxx
2.10
2.11
2.12
請你指導我如何做到這一點?
謝謝。
您可以嘗試PARSENAME
ORDER BY CAST(PARSENAME(DetailRefNumber,2) AS INT),CAST(PARSENAME(DetailRefNumber,1) AS INT)
+1一個整潔的把戲! – Blorgbeard
謝謝大家的幫助。你們給了我很多其他的想法和知識。我非常感謝你的幫助和貢獻。感謝數百萬。 – TTCG
我已經
從來沒有
只是試過這個,但你可以嘗試CAST
或CONVERT
列的順序?
嘗試......
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))
只注意到「版本號排序」。 就拿正是我所做的和改變的最後一部分,愉快使用子/什麼marc_s發佈的作品:
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)
不行 - 嘗試在那裏放置一個'1.2':應該出現在'1.0'之後但在'1.10'之前 – Blorgbeard
這會導致2.1和2.10被認爲是等同的......和2。3將在2.10之後結束。 – GendoIkari
這就是aminor的細節,關鍵是你可以使用CAST/CONVERT來排序你的元素,只需使用一個子串。 – JonH
您需要使用SUBSTRING和CAST ...
order by
CAST(SUBSTRING(DetailRefNumber, 0, 1) as int),
CAST(SUBSTRING(DetailRefNumber, 2, LEN(DetailRefNumber) - 2) as int)
首先會爲了通過小數點前的數字,然後小數點後的數字,並且2.10大於2.3。
由於'SUBSTRING'不可SARGable,因此這將強制進行表掃描 – JNK
此外,這裏假設「整數」是一位數字。當他們遇到'10.1','10.2'等時會發生什麼? –
我的意思是它比起完整的複製粘貼解決方案更像一個起點。 – GendoIkari
如果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
+1我沒有注意到「版本」號碼的排序,所以這肯定會做到這一點。 – JonH
select *
from yourTable
order by
assessmentRefNum,
convert(int,right(detailRefNum,len(detailRefNum)-charindex('.',detailRefNum,1)));
你試過了嗎?就像@ Christian的回答一樣,這也會錯誤地將'2.10'在'2.3'之前排序,無論'assessmentRefNum'是字符串還是數字。 –
是的,我使用assessmentRefNum varchar(1)和detailRefNum varchar(5)運行它,值正確排序。我會發布圖片,但由於我是新的,我不能。 – Chris
'DetailRefNumber'是什麼類型? –
它的類型是什麼?請不要說char/varchar/nvarchar – JonH
不幸的是,它是varchar(20) – TTCG