ORDER BY不按数字顺序放置SELECT语句

时间:2013-12-13 16:51:21

标签: sql-server tsql

我正在处理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.我如何实现这一目标?

3 个答案:

答案 0 :(得分:4)

鉴于您的数据结构(具有常量前缀),可能是获得所需内容的最简单方法:

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

首先按长度排序,然后按数字本身排序。

答案 1 :(得分:3)

这些是字符串。你真的希望SQL Server能够识别结果中每一行中的字符6都有一个数字,而不是按字符6排序,他们假装SUPP-5实际上是{{ 1}?如果这对您有用,那些期望相反行为(将整个字符串视为字符串)的人会抱怨。真正的解决方法是将这些信息存储在两个单独的列中,因为它显然是两个独立的数据。

与此同时,你可以破解一些东西,比如:

SUPP-05

正如马丁解释的那样,这应该是外部查询,而不仅仅是用于生成ORDER BY LEFT(col, 4), CONVERT(INT, SUBSTRING(col, 6, 255))); - 单独生成行号并不能保证结果将按该值排序。这只能用于额外的检查,以确保每一行都有一个可以转换为int的破折号后面的值。只要你ROW_NUMBER(),这就会中断。

答案 2 :(得分:1)

按字典顺序排序字符串。要获得数字排序,您需要从字符串中提取数字(使用substring())并将其转换为整数。