2013-12-13 78 views
0

我正在使用SELECT語句。ORDER BY不按數字順序放置SELECT語句

USE SCRUMAPI2 

DECLARE @userParam VARCHAR(100) 
    ,@statusParam VARCHAR(100) 

SET @userParam = '%' 
SET @statusParam = '%' 

SELECT ROW_NUMBER() OVER (
     ORDER BY PDT.[Name] DESC 
     ) AS 'RowNumber' 
    ,PDT.[Name] AS Project 
    ,(
     CASE WHEN (
        STY.KanBanProductId IS NOT NULL 
        AND STY.SprintId IS NULL 
        ) THEN 'KanBan' WHEN (
        STY.KanBanProductId IS NULL 
        AND STY.SprintId IS NOT NULL 
        ) THEN 'Sprint' END 
     ) AS ProjectType 
    ,STY.[Number] StoryNumber 
    ,STY.Title AS StoryTitle 
    ,TSK.[Name] AS Task 
    ,CONVERT(VARCHAR(20), STY.Effort) AS Effort 
    ,CONVERT(VARCHAR(20), TSK.OriginalEstimateHours) AS OriginalEstimateHours 
    ,TSK.STATUS AS STATUS 
FROM Task TSK 
LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story 
LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint 
LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product 
WHERE TSK.PointPerson LIKE @userParam 
    AND TSK.STATUS LIKE @statusParam 
GROUP BY STY.[Number] 
    ,TSK.STATUS 
    ,STY.Title 
    ,PDT.[Name] 
    ,TSK.CreateDate 
    ,TSK.[Name] 
    ,STY.KanBanProductId 
    ,STY.SprintId 
    ,TSK.OriginalEstimateHours 
    ,STY.Effort 

我的問題是,雖然我有ORDER BY的故事數第一預期它不返回排序中(如下圖列STY [數字]):

enter image description here

正如你可以看到它從33到4到42的敵人,我希望它的數字順序,以便4將在3和5之間而不是33和42.我該如何實現這一目標?

+0

是否所有的名字都以'SUPP-'開頭?您的訂單正在正常工作,您正在對一個字符串進行排序。您需要更改您的代碼,以便按名稱的數字部分進行排序。 – Taryn

+0

您正在對字符字段進行排序,而不是數字。如果您想對此進行特別排序,則需要提取數字部分。 – Andrew

+0

不,有很多字母代碼,但它們都是以相同的格式CMIS-550爲例。 –

回答

4

鑑於你的數據結構(以恆定的前綴),可能是最簡單的方式來獲得你想要的是:

order by len(STY.[Number]), STY.[Number] 

此訂單首先由長度,然後通過數字本身。

1

它按字典順序按字符串排序。要獲得數字排序,您需要從字符串中提取數字(使用substring())並將其轉換爲整數。

3

那些是字符串。你真的希望SQL Server能夠確定結果中每行有6位數字,而不是按字符6排序,他們假裝SUPP-5實際上是SUPP-05?如果這對你有用,那些期待相反行爲的人(將整個字符串視爲字符串)會抱怨。真正的解決辦法是將這些信息存儲在兩個單獨的列中,因爲它顯然是兩個單獨的數據。

在此期間,你可以砍的東西,如:

ORDER BY LEFT(col, 4), CONVERT(INT, SUBSTRING(col, 6, 255))); 

正如馬丁解釋說,這應該是在外部查詢,而不只是用於生成ROW_NUMBER() - 單獨生成行數不保證結果將按該值排序。這隻會與額外的檢查一起工作,以確保每一行在可以轉換爲int的短劃線之後都有一個值。只要你有SUPP-5X這將打破。