我有一张这样的表
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]
我正试图以降序
从MaxDD列中获取数据SELECT distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY "MaxDD" Desc
但是这会按以下顺序返回数据 根据我的计算,4000必须是第一个值,其次是其他人。但是这个结果让我很吃惊。任何人都可以帮助我吗?
答案 0 :(得分:5)
您将它们存储为文本(nvarchar
),这就是您获得lexographical order的原因。这意味着每个角色从左到右相互比较。因此4000
比30000
“更高”(最后的零无关紧要,因为前4个已经高于3)。
所以正确的方法是将其存储为数值。但是,这似乎是不可能的,因为您还使用16.000 with 4.1/2"DP
之类的值。然后我会添加另一列,一列用于您想要排序的数值,另一列用于文本表示。
答案 1 :(得分:3)
由于MaxDD
是varchar
,而不是数字,它按字典顺序排序(即按第一个字符排序,然后是第二个,......),而不是数字。您应该将其转换为数值
答案 2 :(得分:0)
此行为是由nvarchar类型引起的。
试试这个:
SELECT distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY CAST ("MaxDD" as Int)