У меня есть данные, как этотSQL сортировать по номеру содержится как подстроки
Name SortOrder
-------------------
Lower 1 3
Lower 10 2
Lower 2 1
Lower 1% 6
Lower 1.5% 5
Lower 3% 4
Average 7
Upper 1 10
Upper 10 8
Upper 1% 12
Upper 1.5% 11
Average 10 /* sorted
Average Poor 11 * alphabetically
Rich 12 * only */
Min_Low10 17
Min_Low20 18
Min_Low30 19
Min_Up10 20
Min_Up20 21
Min_Up30 22
Я хочу, чтобы обновить порядка сортировки, так что, когда я сортирую по ней, она будет выглядеть следующим образом
Name SortOrder
-------------------
Lower 3% 1
Lower 1.5% 2
Lower 1% 3
Lower 10 4
Lower 2 5
Lower 1 6
Min_Low30 7
Min_Low20 8
Min_Low10 9
Average 10 /* sorted
Average Poor 11 * alphabetically
Rich 12 * only */
Min_Up10 13
Min_Up20 14
Min_Up30 15
Upper 1 16
Upper 2 17
Upper 10 18
Upper 1% 19
Upper 1.5% 20
т.е. те подгруппы с числами должны либо сортироваться по восходящей, либо нисходящей (в зависимости от того, что ее нижняя или верхняя) и что-либо еще без числового числа должны быть просто отсортированы в алфавитном порядке и помещены между ними.
Я думаю, что у меня есть группа по первым символам каждой подгруппы, а затем преобразуйте числовое число и порядок. Но это дает мне сообщение об ошибке при попытке преобразовать его: Error converting data type varchar to numeric.
SELECT * ,RowNum = CASE WHEN Name LIKE 'Lower %[%]' THEN ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By CAST(SUBSTRING(Name,7,LEN(Name)-3) as decimal) DESC) WHEN Name LIKE 'Lower %' THEN ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By SUBSTRING(Name,7,LEN(Name)) DESC) WHEN Name LIKE 'Upper %[%]' THEN (ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By SUBSTRING(Name,7,LEN(Name)-3))) WHEN Name LIKE 'Upper %' THEN (ROW_NUMBER() over (partition by SUBSTRING(Name,1,5) ORDER By SUBSTRING(Name,7,LEN(Name)))) ELSE -1 END FROM Table1 ORDER BY RowNum
вот sqlfiddle
Edit: измененные значения данных, поскольку они включают в себя: 1, а также 10, который будет неправильно отсортированы, если они являются varchars.
Вы можете выбрать 'SUBSTRING (имя, 7, LEN (Имя) -3)' и посмотреть, что это дает? Я предполагаю, что это не «десятичный». – NickyvV
Нет, это варчар. вот почему я хочу отдать его десятичному значению – user3710760
Я знаю это, но что делает 'SELECT SUBSTRING (Name, 7, LEN (Name) -3) FROM Table1 WHERE Name LIKE 'Lower% [%]'' return? – NickyvV