Заказ 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] 

И я пытаюсь получить данные из столбца MaxDD в порядке убывания

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

Но это возвращает данные в следующем порядке введите описание изображения здесь Согласно моим расчетам, 4000 должно быть первым значением, за которым следуют другие. Но эти результаты поразили меня. Может ли кто-нибудь помочь мне в этом?

Вы храните их как текст ( nvarchar ), поэтому вы получаете лессографический порядок . Это означает, что каждый персонаж сравнивается друг с другом слева направо. Следовательно, 4000 «выше», чем 30000 (последний нуль не имеет значения, так как первые 4 уже превышают 3).

Таким образом, правильный способ – сохранить его как числовое значение. Однако это кажется невозможным, так как вы также используете такие значения, как 16.000 with 4.1/2"DP . Тогда я бы добавил еще один столбец, один для числового значения, которое вы хотите заказать, а другое для текстового представления.

Поскольку MaxDD является varchar , а не числом, он сортируется в лексикографическом порядке (т.е. упорядочивается первым символом, затем вторым, …), а не численным. Вы должны преобразовать его в числовое значение

Такое поведение связано с типом nvarchar.

Попробуй это:

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