ORDER BY 从 MIN 到 MAX

Posted

技术标签:

【中文标题】ORDER BY 从 MIN 到 MAX【英文标题】:ORDER BY from MIN to MAX 【发布时间】:2014-07-11 18:22:48 【问题描述】:

我是 SQL Server 的新手。我有一个小问题,我无法查找。关键是我无法在我的列STATEID 中获取数据的顺序,我想将它从最小值排序到最大值。我正在使用ORDER BYASC,但它不起作用。还有什么其他方式可以从我的列STATEID 中得到精确的最小到最大序列。我正在使用 SQL Server 2008。

这是我的代码示例。

ALTER PROCEDURE [dbo].[basicGatherSelect]
    @StateID            nvarchar(5),    
    @Name               nvarchar(50)
AS
BEGIN 
    BEGIN TRANSACTION 

    SET NOCOUNT ON;

    SELECT  
       StateID, name
    FROM 
        tblState 
    ORDER BY 
        STATEID ASC

    IF  @@error <> 0
    BEGIN
            ROLLBACK
            RAISERROR ('PROBLEM', 16, 1)
            RETURN
    END

    COMMIT
END

结果:

10黎班 3 俄罗斯 4 莱托尼亚 5 奥地利 7 巴西 8 Njemacka 9 阿根廷 1 斯比贾 2 波斯纳

【问题讨论】:

你能发布这些行吗? 我现在发布了。我会发送图片,但我没有声誉 您是否使用 NVARCHAR 作为 STATEID?如果它们都是数字,则使用 INT。 Bad habits to kick : choosing the wrong data type - 你应该始终使用最合适的数据类型 - 毕竟这就是它们的用途!如果您有 numbers - 那么请使用 numeric 数据类型,这样您就可以将它们相加并正确排序!不要仅仅出于懒惰而使用字符串! 将STATEID转换为INT,然后排序。 CAST(STATEID AS INT) ASC 【参考方案1】:

试试这个:

ALTER PROCEDURE [dbo].[basicGatherSelect]
    @StateID            nvarchar(5),    
    @Name               nvarchar(50)
AS
BEGIN 
    BEGIN TRANSACTION 

    SET NOCOUNT ON;

    SELECT  
       StateID, name
    FROM 
        tblState 
    ORDER BY 
        CAST(STATEID AS INT) ASC

    IF  @@error <> 0
    BEGIN
            ROLLBACK
            RAISERROR ('PROBLEM', 16, 1)
            RETURN
    END

    COMMIT
END

【讨论】:

当我把数据类型改成int排序已经成功通过了!这是否意味着当数据类型为 nvarchar 且列包含数字时,它不能从小到大排序【参考方案2】:

如果您无法控制参数的来源(因此您无法将其更改为 int)

按字符串排序会导致它像按字母顺序排序一样考虑其他字符。

如果你有一个有 21 个项目的东西......它会去......

1、10、11、12...等,2、20、21、3、4...等

您总是可以转换为 int 进行排序(假设 ID 始终是数字):

ORDER BY 
    CAST(@StateID AS INT) ASC

关于这篇文章的更多信息:SQL ORDER chars numerically

【讨论】:

当我把数据类型改成int排序已经成功通过了!这是否意味着当数据类型为 nvarchar 且列包含数字时,它不能从小到大排序

以上是关于ORDER BY 从 MIN 到 MAX的主要内容,如果未能解决你的问题,请参考以下文章

MySQL分组条件,group by order by limit 顺序

在 ORDER BY 中使用 CASE 语句

为啥 MIN() 查询会比 ORDER BY X LIMIT 1 慢?

不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)

SQL ORDER 结果 BY 多个子句

sql中order by和group by的区别