초보 쿼리 질문드립니다.. 0 7 1,768

by 초보탈충 [Oracle 기초] 쿼리 [2012.06.05 11:39:17]



안녕하세요~

초보인지라 혼자서 해결이 안되는 쿼리가 있어 질문 드립니다.


NO   GROUP
------------------------------
A1    3
A2    3
A3    3
A4    3
B1    3
B2    3
B3    3
B4    3
C1    1
C2    1
C3    1
C4    1
D1    1
D2    1
D3    1
D4    1
E1    2
E2    2
E3    2
E4    2
F1    2
F2    2
F3    2
F4    2
.   .
.   .
.   .

이런 모양의 테이블이 있는데 현재의 GROUP에 대한 ORDER는 그대로 유지한체 NO의 순서만 바꾸고자 합니다.

A1    3
A2    3
B1    3
B2    3
A3    3
A4    3
B3    3
B4    3
C1    1
C2    1
D1    1
D2    1
C3    1
C4    1
D3    1
D4    1
E1    2
E2    2
F1    2
F2    2
E3    2
E4    2
F3    2
F4    2

이런식으로 같은  GROUP내에 뒷자리 1,2가 앞으로 3,4가 뒤로 오게 하고 싶은데 잘안되네요,,

GROUP에 대한 ORDER는 바뀌면 안되고 그대로 유지한 체로요...

답변 미리 감사드립니다.. ^_^
by 손님 [2012.06.05 12:56:06]
 
select no
   , grp
from t
order by ceil(substr(no, 2)/2), no; 

by 초보탈충 [2012.06.05 13:46:53]

아 뒷부분이 숫자가 아니고 문자입니다 ㅠ
1A
1B
1C
1D
2A
2B
2C
2D

1A   3
1B   3
2A   3
2B   3
1C   3
1D   3
2C   3
2D   3
이런식으로요

by 마농 [2012.06.05 14:13:15]

질문이 오락가락 하네요?
다시 정리해서 질문하시는게 좋을 듯.
- 그룹은 3,1,2 순서로 나와야 하는거 맞나요? 다른 숫자는 없는거죠?
- no 는 숫자 + 문자 두자리 인가요?
- 어떤 조합들이 가능한지 모든 가능한 조합 및 그에 대한 정렬 기준을 명확하게...


by 초보탈충 [2012.06.05 15:19:11]

마농님 감사합니다.
그룹은 1~무한대의 숫자가 가능합니다,,,(보통 100이내)
앞에 NO는 날짜+SEQ+문자1자리 입니다.

그래서 날짜+SEQ로 이미 정렬이 되어있는 상태이고 GROUP는 날짜+SEQ에 종속되어 있습니다.
(다만 3,1,2 처럼 그룹이 나눠져 있지는 않고(3,1,2,3 처럼 3이 중복되지 않음) 그룹번호별로
 날짜+SEQ 가 종속되어 있습니다...

1A 3
1B 3
1C 3
1D 3
2A 3
2B 3
2C 3
2D 3

이런식으로 no컬럼의 문자 앞에 SEQ가 있습니다
즉 SEQ+문자가 원 테이블이고

1A 3
1B 3
2A 3
2B 3
3A 3
3B 3
1C 3
1D 3
2C 3
2D 3
3C 3
3D 3

4A 1
4B 1
5A 1
5B 1
6A 1
6B 1
4C 1
4D 1
5C 1
5D 1
6C 1
6D 1



이런식으로 GROUP은 묶여야 하고(즉 GROUP이 ORDER BY 되면 안됨)
한 그룹 안에서 앞에 SEQ다음 문자가 AB인게 먼저 CD인게 뒤에 몰려야 합니다.
SEQ도 뒷문자 AB,또는 CD안에서는 SEQ순으로 정렬되어야 하구요

감사합니다.

by 마농 [2012.06.05 15:42:39]

주어진 정보만 가지고 문제를 해결해야 하는데...
주어진 정보가 너무 임의로 조작되어 실제 정보와 상이하네요...
그룹도 순서대로 1,2,3 이 아닌 3,1,2 의 모호한 순서로 예시를 들어 주시니...
그룹별로 함께 출력되려면 그룹 또한 정렬기준이 되어야 하는데...


ORDER BY 그룹
, CASE WHEN SUBSTR(no, -1) IN ('A','B') THEN 1 ELSE 2 END
, no
;


by 마농 [2012.06.05 15:53:46]

아! 이제서야 어렵사리 이해되네요.
no 로 정렬된 상태에서의 그룹순서를 그대로 유지하시겠다는 말이군요.


ORDER BY MIN(no) OVER(PARTITION BY 그룹)
, CASE WHEN SUBSTR(no, -1) IN ('A','B') THEN 1 ELSE 2 END
, no
;


by 손님 [2012.06.12 17:22:18]

우와..... 여기저기서 쿼리를 볼때마다 감탄사만 나와요
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입