Сортировка в TSQL - PullRequest
       1

Сортировка в TSQL

2 голосов
/ 10 августа 2011

Я использую SQL Server 2008.

Я бы хотел отсортировать результаты, используя DetailRefNumber. Тем не менее, я не смог добиться сортировки, как

2.1 
2.2 
2.3 
xxx
xxx
2.10
2.11
2.12

Не могли бы вы указать мне, как я могу это сделать?

enter image description here Спасибо.

Ответы [ 5 ]

5 голосов
/ 10 августа 2011

Если это DetailRefNumber будет всегда числом, разделенным точкой, вы можете добавить к этой таблице два вычисляемых столбца, которые в основном разбивают этот столбец на два отдельных числовых значения:

alter table dbo.YourTable
  add RefNrMajor AS CAST(LEFT(DetailRefNumber, CHARINDEX('.', DetailRefNumber) - 1) AS INT) PERSISTED

alter table dbo.YourTable
  add RefNrMinor AS CAST(SUBSTRING(DetailRefNumber, CHARINDEX('.', DetailRefNumber) + 1, 999) AS INT) PERSISTED

и теперь вы можете заказать по этим новым числовым столбцам:

SELECT (columns)
FROM dbo.YourTable
ORDER BY RefNrMajor, RefNrMinor
3 голосов
/ 10 августа 2011

Я никогда только что попробовал это, но вы можете попробовать CAST или CONVERT столбец в порядке?

Попробуйте это ...

SELECT
 ...
FROM
...
ORDER BY
 CAST(MyColumn AS Decimal(18,2))

Это работает:

CREATE TABLE #t
 (
  mycol varchar(20)
 )

INSERT INTO #t(mycol) VALUES('1.0')
INSERT INTO #t(mycol) VALUES('1.10')
INSERT INTO #t(mycol) VALUES('2.10')
INSERT INTO #t(mycol) VALUES('21.20')
INSERT INTO #t(mycol) VALUES('2.00')

SELECT * FROM #t ORDER BY CAST(mycol as Decimal(18,2))

DROP TABLE #t

enter image description here

Ваш стал бы:

SELECT
   AssessmentID,
   AssessmentRefNumber,
   DetailRefNumber
FROM 
   Assessments
ORDER BY
   CAST(DetailRefNumber As Decimal(18,2))

редактировать

Только что заметил "сортировку номера версии". Возьмите именно то, что я сделал, и измените заключительную часть, чтобы использовать подстроку / то, что опубликовал marc_s, работает приятно:

CREATE TABLE #t
 (
  mycol varchar(20)
 )

INSERT INTO #t(mycol) VALUES('1.0')
INSERT INTO #t(mycol) VALUES('1.2')
INSERT INTO #t(mycol) VALUES('1.11')
INSERT INTO #t(mycol) VALUES('2.10')
INSERT INTO #t(mycol) VALUES('21.20')
INSERT INTO #t(mycol) VALUES('2.20')
INSERT INTO #t(mycol) VALUES('2.00')
INSERT INTO #t(mycol) VALUES('2.11')
INSERT INTO #t(mycol) VALUES('2.2')

SELECT 
   * 
FROM #t 
ORDER BY 
  CAST(LEFT(mycol, CHARINDEX('.', myCol)-1) AS int), 
  CAST(SUBSTRING(myCol, CharINDEX('.', mycol)+1, 999) AS int)
2 голосов
/ 10 августа 2011

Вы можете попробовать PARSENAME

ORDER BY CAST(PARSENAME(DetailRefNumber,2) AS INT),CAST(PARSENAME(DetailRefNumber,1) AS INT)
1 голос
/ 10 августа 2011

Вам нужно использовать SUBSTRING и CAST ...

order by 
    CAST(SUBSTRING(DetailRefNumber, 0, 1) as int),
    CAST(SUBSTRING(DetailRefNumber, 2, LEN(DetailRefNumber) - 2) as int)

Это будет сначала порядок по числу перед десятичной дробью, затем по числу после десятичной дроби, и обработать 2.10 как больше чем 2.3.

0 голосов
/ 10 августа 2011
select *  
from yourTable  
order by  
assessmentRefNum,  
convert(int,right(detailRefNum,len(detailRefNum)-charindex('.',detailRefNum,1)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...