日期:2014-05-17  浏览次数:20383 次

今天笔试碰到一个sql不会写,拜托大家帮我看看呢。
现有一堆数据,13-1,13-2,13-4,13-7,13-3,14-1,13-8,14-2,13-9
请写相应的查询语句,让这堆数据变为13-1,13-2,13-3,13-4,13-7,13-8,13-9,14-1,14-2的顺序,
求大神帮我解惑,谢谢。
------解决方案--------------------
--前后两半部分的位数都不一致的情况下如何排序
DECLARE @t TABLE ( n VARCHAR(10) )
INSERT INTO @t 
SELECT '13-1' union
SELECT '13-2' union
SELECT '13-4' union
SELECT '13-7' union
SELECT '13-3' union
SELECT '14-1' union
SELECT '13-8' union
SELECT '14-2' union
SELECT '13-9' UNION
SELECT '1-1' union
select '2-1' union
select '4-10' union 
select '4-101'

SELECT n,
SUBSTRING(n,1,CHARINDEX('-',n)-1) AS 前半部分,
SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)) AS 后半部分
FROM @t ORDER BY
--取出前半部分,并转为INT再排序
CONVERT(INT,SUBSTRING(n,1,CHARINDEX('-',n)-1)),
--取出后半部分,并转为INT再排序
CONVERT(INT,SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)))



------解决方案--------------------
引用:
--前后两半部分的位数都不一致的情况下如何排序
DECLARE @t TABLE ( n VARCHAR(10) )
INSERT INTO @t 
SELECT '13-1' union
SELECT '13-2' union
SELECT '13-4' union
SELECT '13-7' union
SELECT '13-3' union
SELECT '14-1' union
SELECT '13-8' union
SELECT '14-2' union
SELECT '13-9' UNION
SELECT '1-1' union
select '2-1' union
select '4-10' union 
select '4-101'

SELECT n,
SUBSTRING(n,1,CHARINDEX('-',n)-1) AS 前半部分,
SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)) AS 后半部分
FROM @t ORDER BY
--取出前半部分,并转为INT再排序
CONVERT(INT,SUBSTRING(n,1,CHARINDEX('-',n)-1)),
--取出后半部分,并转为INT再排序
CONVERT(INT,SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)))




收到!