Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сортировать  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 634
Здравствуйте. Ни как не могу сообразить. Есть значения:

Nomer
2.7.6.1.
2.7.6.3.
2.7.6.4.
2.7.6.2.
2.7.6.10.
как мне отсортировать по возрастанию, а то получается вот так:

Nomer
2.7.6.1.
2.7.6.10.
2.7.6.2.
2.7.6.3.
2.7.6.4.
7 июн 09, 15:54    [7274058]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36816
Сначала создаем сами себе трудности, храня числа, как строки, а потом начинаем их героически преодолевать?
7 июн 09, 16:07    [7274069]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 634
а это не числа. есть у меня таблица со статьями бюджета. конкретно этот столбец справочная информация "номер статьи". как прикажете по другому отсортировать?
7 июн 09, 16:11    [7274075]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 634
ID ParentID Nomer Name
1 0 1. dfsf
2 1 1.1.
3 1 1.2.
4 3 1.2.1.
5 2 1.1.1.
7 июн 09, 16:13    [7274077]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать  [new]
maximIZ
Member

Откуда: Спб
Сообщений: 634

ID         ParentID             Nomer                Name
1              0                  1.                dfsf
2              1                  1.1.
3              1                  1.2.
4              3                  1.2.1.
5              2                  1.1.1.
7 июн 09, 16:15    [7274079]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать  [new]
an0nym
Member

Откуда:
Сообщений: 7076
Вариант в лоб.
WITH [slice] AS(
	SELECT '2.7.6.1.' [paragraph] 
	UNION ALL SELECT '2.7.6.3.' 
	UNION ALL SELECT '2.7.6.4.'
	UNION ALL SELECT '2.7.6.2.'
	UNION ALL SELECT '2.7.6.10.'
) 
SELECT *
 FROM [slice]
 ORDER BY 
	CAST(SUBSTRING([paragraph],1,CHARINDEX('.',[paragraph],0)-1) AS TINYINT)
	,CAST(SUBSTRING([paragraph],CHARINDEX('.',[paragraph],0)+1,CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],0)+1)-(CHARINDEX('.',[paragraph],0)+1)) AS TINYINT)
	,CAST(SUBSTRING([paragraph],CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],0)+1)+1,CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],0)+1)+1)-(CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],0)+1)+1)) AS TINYINT)
	,CAST(SUBSTRING([paragraph],CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],0)+1)+1)+1,CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],0)+1)+1)+1)-(CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],CHARINDEX('.',[paragraph],0)+1)+1)+1)) AS TINYINT)
7 июн 09, 18:10    [7274197]     Ответить | Цитировать Сообщить модератору
 Re: Сортировать  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
maximIZ

ID         ParentID             Nomer                Name
1              0                  1.                dfsf
2              1                  1.1.
3              1                  1.2.
4              3                  1.2.1.
5              2                  1.1.1.
Хорошо бы для сортировки иметь вот такое поле:
ID         ParentID             Nomer             Path                                  Name
1              0                  1.                00000000001                          dfsf
2              1                  1.1.              0000000000100000000001
3              1                  1.2.              0000000000100000000002
4              3                  1.2.1.            000000000010000000000200000000001
5              2                  1.1.1.            000000000010000000000100000000001
Значение этого поля должно состоять из фрагментов с постоянной длиной, максимальной для строкового представления типа поля ID.
Тогда по полю Path можно сортировать, как Вы хотите.
Вместо нулей можно использовать пробел. Тогда поле Nomer можно сделать вычисляемым на основе Path:
Nomer AS REPLACE(LTRIM(REPLACE(REPLACE(REPLACE([Path],'  ',' *'),'* ',''),'*','')),' ','.')+'.'
7 июн 09, 18:28    [7274218]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить