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 BY
或ASC
,但它不起作用。还有什么其他方式可以从我的列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 顺序
为啥 MIN() 查询会比 ORDER BY X LIMIT 1 慢?
不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)