2011-08-10 116 views
2

我正在使用SQL Server 2008.排序在TSQL

我想通過使用DetailRefNumber排序我的結果。然而,我無法實現像

2.1 
2.2 
2.3 
xxx 
xxx 
2.10 
2.11 
2.12 

請你指導我如何做到這一點?

enter image description here謝謝。

+0

'DetailRefNumber'是什麼類型? –

+1

它的類型是什麼?請不要說char/varchar/nvarchar – JonH

+0

不幸的是,它是varchar(20) – TTCG

回答

2

您可以嘗試PARSENAME

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

+1一個整潔的把戲! – Blorgbeard

+0

謝謝大家的幫助。你們給了我很多其他的想法和知識。我非常感謝你的幫助和貢獻。感謝數百萬。 – TTCG

3

我已經 從來沒有 只是試過這個,但你可以嘗試CASTCONVERT列的順序?

嘗試......

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 

enter image description here

你的將成爲:

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) 
+0

不行 - 嘗試在那裏放置一個'1.2':應該出現在'1.0'之後但在'1.10'之前 – Blorgbeard

+0

這會導致2.1和2.10被認爲是等同的......和2。3將在2.10之後結束。 – GendoIkari

+0

這就是aminor的細節,關鍵是你可以使用CAST/CONVERT來排序你的元素,只需使用一個子串。 – JonH

1

您需要使用SUBSTRING和CAST ...

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

首先會爲了通過小數點前的數字,然後小數點後的數字,並且2.10大於2.3。

+0

由於'SUBSTRING'不可SARGable,因此這將強制進行表掃描 – JNK

+0

此外,這裏假設「整數」是一位數字。當他們遇到'10.1','10.2'等時會發生什麼? –

+0

我的意思是它比起完整的複製粘貼解決方案更像一個起點。 – GendoIkari

5

如果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 
+0

+1我沒有注意到「版本」號碼的排序,所以這肯定會做到這一點。 – JonH

0
select * 
from yourTable 
order by 
assessmentRefNum, 
convert(int,right(detailRefNum,len(detailRefNum)-charindex('.',detailRefNum,1))); 
+0

你試過了嗎?就像@ Christian的回答一樣,這也會錯誤地將'2.10'在'2.3'之前排序,無論'assessmentRefNum'是字符串還是數字。 –

+0

是的,我使用assessmentRefNum varchar(1)和detailRefNum varchar(5)運行它,值正確排序。我會發布圖片,但由於我是新的,我不能。 – Chris