22,207
社区成员
发帖
与我相关
我的任务
分享
select * from test
order by
substr(test1,0,1) desc,
substr(test1,3,4) desc,
(case substr(test1,3,1) WHEN substr(test1,4,5) THEN substr(test1,3,4) else null end) desc;
以上只计算了1、2、3排序,4、5、6可以以此类推,逻辑都是一样的,望对你有帮助;WITH t(num) AS(
SELECT 3.68 UNION ALL
SELECT 2.69 UNION ALL
SELECT 4.36 UNION ALL
SELECT 0.11 UNION ALL
SELECT 6.00 UNION ALL
SELECT 3.33 UNION ALL
SELECT 4.56 UNION ALL
SELECT 3.78 UNION ALL
SELECT 6.54 UNION ALL
SELECT 7.89 UNION ALL
SELECT 2.22 UNION ALL
SELECT 8.56 UNION ALL
SELECT 4.37 UNION ALL
SELECT 3.21 UNION ALL
SELECT 9.96 UNION ALL
SELECT 8.88 UNION ALL
SELECT 4.65 UNION ALL
SELECT 7.89
)
SELECT * FROM t ORDER BY CASE WHEN num*100%111=0 THEN 6000+(10-num)
WHEN CAST(num AS INT)=num THEN 5000+num
WHEN num*100%11=0 THEN 4000
WHEN num*100%111=12 THEN 3000
WHEN num*100%111=99 THEN 2000
ELSE (CAST(num AS INT)+CAST(num*10%10 AS INT)+CAST(num*100%10 AS INT))%10*10
END DESC
/*
num
2.22
3.33
8.88
6.00
0.11
7.89
4.56
7.89
6.54
3.21
8.56
3.78
2.69
3.68
4.65
9.96
4.37
4.36
*/
;WITH t(num) AS(
SELECT 3.68 UNION ALL
SELECT 2.69 UNION ALL
SELECT 4.36 UNION ALL
SELECT 0.11 UNION ALL
SELECT 6.00 UNION ALL
SELECT 3.33 UNION ALL
SELECT 4.56 UNION ALL
SELECT 3.78 UNION ALL
SELECT 6.54 UNION ALL
SELECT 7.89 UNION ALL
SELECT 2.22 UNION ALL
SELECT 8.56 UNION ALL
SELECT 4.37 UNION ALL
SELECT 3.21 UNION ALL
SELECT 9.96 UNION ALL
SELECT 8.88 UNION ALL
SELECT 4.65 UNION ALL
SELECT 7.89
)
SELECT * FROM t ORDER BY CASE WHEN num*100%111=0 THEN 6000
WHEN CAST(num AS INT)=t.num THEN 5000
WHEN num*100%11=0 THEN 4000
WHEN num*100%111=12 THEN 3000
WHEN num*100%111=99 THEN 2000
ELSE (CAST(num AS INT)+CAST(num*10%10 AS INT)+CAST(num*100%10 AS INT))%10*10
END desc, num desc
/*
num
8.88
3.33
2.22
6.00
0.11
7.89
7.89
4.56
6.54
3.21
8.56
3.78
3.68
2.69
4.65
9.96
4.37
4.36
*/
;WITH a AS(
SELECT t.num,STUFF(p.s,1,1,'') AS s ,s.tn
,CASE WHEN STUFF(p.s,1,1,'') ='0,0,0' THEN 1
WHEN STUFF(p.s,1,1,'') LIKE '0,-[1-9],0' THEN 2
WHEN STUFF(p.s,1,1,'') LIKE '0,[1-9],0' THEN 3
WHEN STUFF(p.s,1,1,'') ='0,1,1' THEN 4
WHEN STUFF(p.s,1,1,'') ='0,-1,-1' THEN 5
ELSE 6 END AS NumType
FROM #td AS t
CROSS APPLY(
SELECT ','+CONVERT(VARCHAR,
CONVERT(INT,SUBSTRING(convert(VARCHAR,t.num),sv.number,1))-
CONVERT(INT,CASE WHEN SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1)='.' THEN SUBSTRING(convert(VARCHAR,t.num),sv.number-2,1)
WHEN sv.number=1 THEN SUBSTRING(convert(VARCHAR,t.num),sv.number,1)
ELSE SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1) END ))
FROM master.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number BETWEEN 1 AND LEN(t.num)
and SUBSTRING(convert(VARCHAR,t.num),sv.number,1)!='.'
FOR XML PATH('')
) p(s)
CROSS APPLY(
SELECT SUM(tn) AS tn FROM (
SELECT CONVERT(INT,SUBSTRING(convert(VARCHAR,t.num),sv.number,1)) AS tn
FROM master.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number BETWEEN 1 AND LEN(t.num) and SUBSTRING(convert(VARCHAR,t.num),sv.number,1)!='.'
) a
) s
)
SELECT a.num,a.tn FROM a ORDER BY NumType,CASE WHEN a.NumType LIKE '[1245]' THEN a.num WHEN a.NumType=3 THEN -num ELSE a.tn%10 END desc
;WITH t(num) AS(
SELECT 3.68 UNION ALL
SELECT 2.69 UNION ALL
SELECT 4.36 UNION ALL
SELECT 0.11 UNION ALL
SELECT 6.00 UNION ALL
SELECT 3.33 UNION ALL
SELECT 4.56 UNION ALL
SELECT 3.78 UNION ALL
SELECT 6.54 UNION ALL
SELECT 7.89 UNION ALL
SELECT 2.22 UNION ALL
SELECT 8.56 UNION ALL
SELECT 4.37 UNION ALL
SELECT 3.21 UNION ALL
SELECT 9.96 UNION ALL
SELECT 8.88 UNION ALL
SELECT 4.65 UNION ALL
SELECT 7.89
)
SELECT * INTO #td FROM t
;WITH a AS(
SELECT t.num,STUFF(p.s,1,1,'') AS s ,CASE WHEN STUFF(p.s,1,1,'') ='0,0,0' THEN 1
WHEN STUFF(p.s,1,1,'') LIKE '0,-[1-9],0' THEN 2
WHEN STUFF(p.s,1,1,'') LIKE '0,[1-9],0' THEN 3
WHEN STUFF(p.s,1,1,'') ='0,1,1' THEN 4
WHEN STUFF(p.s,1,1,'') ='0,-1,-1' THEN 5
ELSE 6 END AS NumType
FROM #td AS t
CROSS APPLY(
SELECT ','+CONVERT(VARCHAR,
CONVERT(INT,SUBSTRING(convert(VARCHAR,t.num),sv.number,1))-
CONVERT(INT,CASE WHEN SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1)='.' THEN SUBSTRING(convert(VARCHAR,t.num),sv.number-2,1)
WHEN sv.number=1 THEN SUBSTRING(convert(VARCHAR,t.num),sv.number,1)
ELSE SUBSTRING(convert(VARCHAR,t.num),sv.number-1,1) END ))
FROM master.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number BETWEEN 1 AND LEN(t.num)
and SUBSTRING(convert(VARCHAR,t.num),sv.number,1)!='.'
FOR XML PATH('')
) p(s)
)
SELECT * FROM a ORDER BY NumType,CASE WHEN a.NumType LIKE '[1245]' THEN a.num ELSE -num END desc
/*
num s NumType
8.88 0,0,0 1
3.33 0,0,0 1
2.22 0,0,0 1
6.00 0,-6,0 2
0.11 0,1,0 3
7.89 0,1,1 4
7.89 0,1,1 4
4.56 0,1,1 4
6.54 0,-1,-1 5
3.21 0,-1,-1 5
2.69 0,4,3 6
3.68 0,3,2 6
3.78 0,4,1 6
4.36 0,-1,3 6
4.37 0,-1,4 6
4.65 0,2,-1 6
8.56 0,-3,1 6
9.96 0,0,-3 6
*/
/*
num
8.88
3.33
2.22
6.00
0.11
7.89
7.89
4.56
6.54
3.21
2.69
3.68
3.78
4.36
4.37
4.65
8.56
9.96
*/