질문드립니다ㅜㅜ 0 4 1,734

by 신입개발자 [SQL Query] [2014.10.16 08:47:17]


어제 질문을 드렸는데 답변을 듣고 너무 감사했습니다.

오늘은 어제와 비슷한데 다른 어려운점을 물어보고자 합니다.

일단 테이블은 어제와 같구요

WITH A AS( SELECT '002' AS A1 FROM DUAL UNION ALL

SELECT '003' AS A1 FROM DUAL UNION ALL

SELECT '006' AS A1 FROM DUAL UNION ALL

SELECT 'P001' AS A1 FROM DUAL UNION ALL

SELECT 'P002' AS A1 FROM DUAL UNION ALL

SELECT 'P003' AS A1 FROM DUAL UNION ALL

SELECT 'P004' AS A1 FROM DUAL UNION ALL

SELECT 'P005' AS A1 FROM DUAL )

SELECT A1 FROM A

 이렇게 했을때는

002

003

006

P001

P002

P003

P004

P005

이런식으로 나오는데

002

P002

003

P003

006

P001

P004

P005

이런식으로 바꾸려고합니다.. 여기까지는 어제와 같은데

바꾸는 방식이 ORDER BY A1했을 경우 아래처럼 나오는 방식입니다.

A1의 값들을 어떻게 변경하고 ORDER BY A1을 하면 아래처럼 나올수 있을까요..

쿼리고수분들의 도움 부탁드립니다.!!

--참고로 뒤에 3자리만 잘라서 ORDER BY하니

P001

002

P002

003

P003

P004

P005

006

이런식으로 뒤에세자리가 겹치지않는 P가붙은 것들도 앞으로 오게 되더라구요.

세자리가 겹치지 않는 P가 붙은것들은 맨뒤로 가게 할려고 합니다

 

by 신입개발자 [2014.10.16 10:06:59]

SELECT A1
      ,CASE WHEN SUBSTR(A1,-3) IN (SELECT A1 FROM A) THEN SUBSTR(A1,-3)
       ELSE A1
       END B1
  FROM A
  ORDER BY B1

일단 자체 해결로 이렇게 해보긴 했는데 더 좋은 방법이 있다면 알려주시면 감사하겠습니다.

이 쿼리의 단점은 A테이블의 데이터양이 많다면 2번 느려진다는 단점이 있을거 같습니다,


by 비주류 [2014.10.16 10:34:40]
SELECT  a1
FROM    (
            SELECT a1,
                   COUNT(*) OVER (PARTITION BY SUBSTR(a1, -3)) cnt
            FROM   a
        )
ORDER BY cnt DESC, DECODE(cnt, 1, LENGTH(a1)), SUBSTR(a1, -3) 

 


by 백면서생 [2014.10.16 10:38:54]
-- 왜 꼭 order by 하나의 레벨에서 끝내시려는지는 모르겠지만
-- 아래 방법도 참조해 보세요.

select a1
       ,min(a1) over (partition by substr(a1,-3))||a1 b1
from a
order by b1


select a1
from a
order by min(a1) over (partition by substr(a1,-3))||a1

 


by 신입개발자 [2014.10.17 11:46:11]

답변채택은 1분만 되는거군요...

두분다 채택하려다 실패했습니다ㅜㅜ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입