2013-08-27 234 views
1

我有这样SQL排序不能正常工作

CREATE TABLE [dbo].[tbl_LandRigs](
    [ID] [int] IDENTITY(700000,1) NOT NULL, 
    [Company] [nvarchar](500) NULL, 
    [Rig] [nvarchar](500) NULL, 
    [RigType] [nvarchar](200) NULL, 
    [DrawWorks] [nvarchar](500) NULL, 
    [TopDrive] [nvarchar](200) NULL, 
    [RotaryTable] [nvarchar](500) NULL, 
    [MudPump] [nvarchar](500) NULL, 
    [MaxDD] [nvarchar](50) NULL, 
    [Operator] [nvarchar](500) NULL, 
    [Country] [nvarchar](200) NULL, 
    [Location] [nvarchar](500) NULL, 
    [OPStatus] [nvarchar](200) NULL, 
    [CreatedDate] [datetime] NULL, 
    [CreatedByID] [int] NULL, 
    [CreatedByName] [nvarchar](50) NULL, 
CONSTRAINT [PK_tbl_LandRigs] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

一个表,我试图让降序排列

SELECT distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY "MaxDD" Desc 

从MaxDD列数据但这按照以下顺序 返回数据enter image description here 根据我的计算,4000必须是其他人的第一个值。但这个结果使我惊讶。能帮我解决这个问题吗?

+1

你正在将它们存储为文本('nvarchar'),为什么你得到[词法顺序](http://en.wikipedia.org/wiki/Lexicographical_order) –

回答

5

您将它们存储为文本(nvarchar),这就是为什么你lexographical order。这意味着每个角色都从左到右彼此进行比较。因此400030000“更高”(由于前4个已经高于3,因此最后的零不重要)。

所以正确的方法是将它作为数值存储。但是,这似乎是不可能的,因为你也使用像16.000 with 4.1/2"DP这样的值。然后,我会添加另一列,一个用于您要排序的数字值,另一个用于文本表示。

3

由于MaxDDvarchar,它不是一个按照字典顺序排序的数字(即按第一个字符排序,然后第二个排序),而不是数字。您应该将其转换为数值

0

此行为归因于nvarchar类型。

试试这个:

SELECT distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY CAST ("MaxDD" as Int) 
+0

这将失败,因为'MaxDD'至少有一个数字值为16.000,带有4.1/2“DP” –