Сортировать буквенно-цифровой столбец SQL Server - PullRequest
0 голосов
/ 30 октября 2019

Как отсортировать следующие значения из столбца Operation_type?

1.Administration
13.Legal And Contractual Matters
14.Financial
15.Personnel
16.Procurement Of Materials, Works And Services
21.Business Management
3.Information System 

Я попробовал следующий подход, но он не выполняется.

select distinct(Operation_type) 
from tableA  
order by cast(case when Operation_type like '%[0-9]' then right(Operation_type , 1) else null end as int)

Ниже приведен ожидаемый результат:

1.Administration
3.Information System 
13.Legal And Contractual Matters
14.Financial
15.Personnel
16.Procurement Of Materials, Works And Services
21.Business Management

PS: мне нужно получить значения различных столбцов, не используя select *

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Я бы изменил ваш ORDER BY на что-то вроде ниже:

select Operation_type
from (
    select distinct(Operation_type) Operation_type
    from #tableA
    ) tmp
order by CAST(LEFT(operation_type, charindex('.', operation_type) - 1) as int)

Полный рабочий скрипт:

create table #tableA (operation_type nvarchar(max))

insert into #tableA (operation_type) values (
'1.Administration'), (
'13.Legal And Contractual Matters'), (
'14.Financial'), (
'15.Personnel'), (
'16.Procurement Of Materials, Works And Services'), (

select Operation_type
from (
    select distinct(Operation_type) Operation_type
    from #tableA
    ) tmp
order by CAST(LEFT(operation_type, charindex('.', operation_type) - 1) as int)

И вывод вышеприведенного запроса:

enter image description here

2 голосов
/ 30 октября 2019

Вы можете использовать CHARINDEX, чтобы найти положение точки (.) в столбце и использовать числа перед этим для ORDER вашего вывода:

SELECT *
  FROM tableA  
  ORDER BY CAST(LEFT(Operation_type, CHARINDEX('.', Operation_type) - 1) AS INT)

Это полностью зависитхотя они всегда являются точкой (.) в столбце.

Рабочая скрипка, показывающая, что это здесь .

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

SELECT Operation_type
  FROM (
        SELECT *,
               CASE
                 WHEN CHARINDEX('.', Operation_type) > 0 THEN CAST(LEFT(Operation_type, CHARINDEX('.', Operation_type) - 1) AS INT)
                 ELSE 0
               END AS OrderCol
          FROM tableA  
       ) a
  ORDER BY OrderCol

В этом случае записи без точки появятся первыми в списке. Вы можете переместить их в конец, изменив ELSE 0 на большее значение.

Редактировать следующий комментарий о результатах DISTINCT

Следующий измененный запрос также обрабатывает дублирующиеся строки, используяDISTINCT как вы просили:

SELECT Operation_type
  FROM (
        SELECT DISTINCT(Operation_type),
               CASE
                 WHEN CHARINDEX('.', Operation_type) > 0 THEN CAST(LEFT(Operation_type, CHARINDEX('.', Operation_type) - 1) AS INT)
                 ELSE 0
               END AS OrderCol
          FROM tableA  
       ) a
  ORDER BY OrderCol
0 голосов
/ 30 октября 2019

Я бы лично сделал это так и переместил число в другой столбец, чтобы нормализовать данные:

WITH VTE AS
    (SELECT YourString
     FROM (VALUES ('1.Administration'),
                  ('13.Legal And Contractual Matters'),
                  ('14.Financial'),
                  ('15.Personnel'),
                  ('16.Procurement Of Materials, Works And Services'),
                  ('21.Business Management'),
                  ('3.Information System')) V (YourString) )
SELECT TRY_CONVERT(int,L.Num) AS Num,
       STUFF(V.YourString, 1, LEN(L.Num) + 1, '') AS YourString
FROM VTE V
     CROSS APPLY (VALUES (LEFT(V.YourString, NULLIF(CHARINDEX('.', V.YourString), 0) - 1))) L (Num)
ORDER BY TRY_CONVERT(int, L.Num);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...