【发布时间】:2015-05-20 01:13:22
【问题描述】:
我有这样的数据
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
编辑:更改了数据值,因为它们包括 1 和 10,如果它们是 varchars,则排序错误。
【问题讨论】:
-
你能选择
SUBSTRING(Name,7,LEN(Name)-3)看看它给出了什么吗?我猜这不是decimal.. -
不,它是一个 varchar。这就是为什么我想把它转换成小数
-
我知道,但是
SELECT SUBSTRING(Name,7,LEN(Name)-3) FROM Table1 WHERE Name LIKE 'Lower %[%]'会返回什么? -
我会试试
LEN(Name)-1 -
它只返回数字,所以 3, 2.5, 1
标签: sql-server