cabinet_id 라는 열의 정렬을 하려고 하는데
이 안에는 지하 1 층 / 지하 2 층 / 지상 1층 / 지상 2층 / 지상 3 층 / 옥상 이런식으로 값이 들어가있습니다.
이걸 검색했을 경우
옥상
지상 3 층
지상 2 층
지상 1 층
지하 1 층
지하 2 층
이런식으로 층 순으로 정렬하고 싶은데
그냥 order by cabinet_id desc 나 order by cabinet_id asc 로 할경우 앞에 한글 정렬이 되서 숫자가 맞지 않게 되더라구요
위에 제가 원하는 대로 정렬할 방법이 있을까요?? 쿼리를 어떻게 짜야할지 감이 잘 잡히지 않습니다....ㅜㅜ
Comment 5
-
건우아빠
2017.01.06 11:32
-
아힝헝홍
2017.01.06 14:47
감사합니다 근데 이렇게 하면
지상 2층
지상 1층
지하 2층
지하 1층
으로 나오네요...ㅠㅠ
-
건우아빠
2017.01.06 14:57
WITH CABINET AS (SELECT '옥상' as cabinet_id UNION ALLSELECT '지상 3 층' as cabinet_id UNION ALLSELECT '지상 2 층' as cabinet_id UNION ALLSELECT '지상 1 층' as cabinet_id UNION ALLSELECT '지하 1 층' as cabinet_id UNION ALLSELECT '지하 2 층' as cabinet_id)select * , CASE LEFT(cabinet_id,2)WHEN '옥상' THEN ROW_NUMBER() OVER (PARTITION BY LEFT(cabinet_id,2) ORDER BY cabinet_id )WHEN '지상' THEN ROW_NUMBER() OVER (PARTITION BY LEFT(cabinet_id,2) ORDER BY cabinet_id DESC)WHEN '지하' THEN ROW_NUMBER() OVER (PARTITION BY LEFT(cabinet_id,2) ORDER BY cabinet_id ASC)END SORTfrom CABINETOrder byCASE LEFT(cabinet_id,2)WHEN '옥상' THEN 1WHEN '지상' THEN 2WHEN '지하' THEN 3END , SORT -
고구마밥
2017.01.06 11:47
WITH CABINET AS (
SELECT '옥상' as ID UNION ALL
SELECT '지상 3 층' as ID UNION ALL
SELECT '지상 2 층' as ID UNION ALL
SELECT '지상 1 층' as ID UNION ALL
SELECT '지하 1 층' as ID UNION ALL
SELECT '지하 2 층' as ID
)
select id --, lvl, layer, (lvl * layer) as sort
from (
select id
, case
when charindex('옥상', ID) > 0 then 2
when charindex('지상', ID) > 0 then 1
when charindex('지하', ID) > 0 then -1
end as lvl
, (LEFT(SubString(ID, PatIndex('%[0-9]%', ID), LEN(ID)),PatIndex('%[^0-9]%', SubString(ID, PatIndex('%[0-9]%', ID), LEN(ID)))-1 )) as layer --// http://www.sqler.com/765683 에서 참고했습니다.
from cabinet
) T
order by lvl desc, (lvl * layer) desc* cabinet_id 에서 숫자만 추출하는 부분은 함수로 만들어서 적용하면 좀 더 깔끔해 질 듯 합니다. "mssql 숫자만 추출" 구글링하면 함수도 있더군요.
-
아힝헝홍
2017.01.06 14:48
자세히 써주셔서 감사해요~!
실행이 안되는데 with 문 공부좀 해야겠어요...ㅠㅠ
order by
CASE LEFT(cabinet_id,2)
WHEN '옥상' THEN 1
WHEN '지상' THEN 2
WHEN '지하' THEN 3
END , cabinet_id DESC