정렬에 관련된 질문입니다. 0 4 1,496

by 느훼훼 [SQL Query] [2019.04.12 15:11:11]


고유계정대 A 1
고유계정대 B 2
고유계정대 C 3
고유계정대 D 2
고유계정대 E 5
고유계정대 F 6
고유계정대 F 4
고유계정대 G 2

한 테이블에 위와 같은 데이터가 있다고 가정합니다.

현재 ORDER BY절의 경우 순서대로 걸려있습니다. 

ORDER BY 1, 2, 3 이 되겠죠.

툴 기능에 의해 같은 값이 나열될 시 자동으로 셀 합치기가 되어 화면에서 보여주고 있습니다.

첫번째 열인 "고유계정대" 라는 값이 머지가 되어 한 텍스로만 보여지구요,

두번째 열인 알파벳이 들어간 열에서는 한줄 한줄 나오다가 아래에서 3번째인 "F"로 들어가

있는 부분이 머지되어 보여지고 있습니다. 

문제는 세 번째 열인데요;;

세번째 열도 동일한 값이 들어가 있으면 셀이 합쳐져서 하나의 값만 보여지게 하고 싶은데

앞의 ORDER BY 1, 2 때문에 1열과 2열이 먼저 정렬되기 때문에 3열에 같은 값이 있다해도

위, 아래에 인접하지 않으면 셀 머지가 되지 않아 원하는대로 볼 수가 없습니다. 

ORDER BY 1, 3, 2를 하면 3열은 원하는대로 보여질 수 있겠지만 그렇게 되면 2열 부분에서 

어그러지겠죠.

그래서 3열에서 동일값으로 들어가있는 숫자 2만 WHERE조건에 걸어 따로 빼내서 UNION ALL로 

묶어보려해도 UNION절 끝나는 SELECT쿼리에서만 ORDER BY를 쓸 수 있기 때문에 그것도 안되고

난감한 상황입니다.

해결방법이 있을까요?

현재 쿼리는 아래와 같다고 보셔도 될 거 같습니다.

WITH TBL AS
{
SELECT '고유계정대' AS COL1, 'A' COL2, '1' AS COL3 FROM DUAL
UNION ALL
SELECT '고유계정대' AS COL1, 'B' COL2, '2' AS COL3 FROM DUAL
UNION ALL
SELECT '고유계정대' AS COL1, 'C' COL2, '3' AS COL3 FROM DUAL
UNION ALL
SELECT '고유계정대' AS COL1, 'C' COL2, '2' AS COL3 FROM DUAL
UNION ALL
SELECT '고유계정대' AS COL1, 'E' COL2, '5' AS COL3 FROM DUAL
UNION ALL
SELECT '고유계정대' AS COL1, 'F' COL2, '6' AS COL3 FROM DUAL
UNION ALL
SELECT '고유계정대' AS COL1, 'F' COL2, '4' AS COL3 FROM DUAL
UNION ALL
SELECT '고유계정대' AS COL1, 'G' COL2, '2' AS COL3 FROM DUAL
}
SELECT COL1,
       COL2,
       COL3
   FROM TBL
ORDER BY COL1, COL2, COL3

 

질문의 요지를 헷갈려하실 수도 있을 거 같아 궁극적으로 원하는 쿼리를 적어보았습니다.

SELECT COL1, COL2, COL3 FROM TBL WHERE COL3 != '2' ORDER BY COL1, COL2, COL3

UNION

SELECT COL1, COL2, COL3 FROM TBL WHERE COL3 = '2' ORDER BY COL1, COL3, COL2

입니다. 위에서도 언급했지만 UNION에 걸려있는 두 SELECT절에 ORDER BY를 각기 다르게

쓸 수 없기 때문에 난감한 상황입니다.

by 마농 [2019.04.12 15:39:49]

질문이 좀 특정값에 대해 제한적인 경우인 것 같은데요?
항상 '2' 값만 중복된다고 보면 되나요?
다른 값도 중복될 가능성은 없는지?

인접되지 않을 걸 억지로 인접시켜 셀병합을 한다는 건데?
이게 정렬기준가 반대되는 거라서 잘 이해가 안가네요?
왜 그렇게 해야하는지 이유도 모르겠고요.
원하시는 결과표를 만들어 보여 주세요.

2 를 가진게 b,c,g 인데 b,g 는 2만 있어서 상관 없는데.
이 중 c 는 다른 값도 가지고 있어서 애매하구요.
'2' 를 한곳으로 모으다가 c 가 흩어지는 경우가 발생할 수도 있구요.

뭔가 요구사항이 억지스러운 면이 있네요.


by 느훼훼 [2019.04.12 16:55:18]

 

 

고유계정대1 A 1

C

3
E 5
F 4
6
고유계정대2 B 2
C
G

일단 원하는건 위와 같습니다. 

제 짧은 생각으로 C열의 특정값인 2를 WHERE조건에 걸어 따로 발췌하는 방법뿐이라는 생각 때문입니다.

왜냐면 본문에도 언급했지만 ORDER BY절이 현재와 달라지게 되면 1, 2열이 어그러지기 때문입니다.

그리고 아래는 추가 설명입니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

정확히 파악하셨습니다. 요구사항에 억지가 있어요 ㅋㅋ;
업무자가 그냥 그렇게 보고 싶답니다. (C열에 존재하는 특정 값을 중요시 보고 있기 때문입니다.)
C열에는 여러가지 값이 존재 할 수 있는데 특정 값일 때만 
테이블 머지가 되어 보고 싶답니다. 
위 본문에서는 숫자 2라고 가정하였습니다. 
실제로는 KB증권(헷지) 라는 문자열 값이 들어가있어요.
실제 데이터값을 첨부해서 보여드리고 싶은데 사진을 등록할 방법이 없네요;;
보안이 심한 은행인지라 뷰어프로그램밖에 깔려있지 않아 이미지 편집도 불가하네요;;

재차 설명드리면,
1열에는 "고유계정대" 라는 값만 있습니다.

2열에는 우리나라에 존재하는 운용사들의 명칭이 있습니다.
ex)미래에셋, 한국투자, 삼성자산 등등

3열에는 서브위탁사라는 항목으로 값으로 되어있습니다.
ex)미래에셋(계약), 한국투자(계약), 삼성자산(계약), KB증권(헷지) 등등

3열에서 특정값인 "KB증권(헷지)"가 여러 개 존재할 수 있는데 이 때 KB증권(헷지)라는
값만 뭉쳐놓아(테이블머지) 하나의 텍스트로 보여주고자 합니다.

이번엔 제대로 된 설명이 되었는지 모르겠습니다.


by 느훼훼 [2019.04.12 17:53:04]

아!!!!!!

이것저것 생각해보다가 해결했습니다;; 

본문의 예제로 보자면,

SELECT A.COL01, 
       A.COL02, 
       A.COL03
    FROM (
                SELECT DECODE(COL_03, '2', '고유계정대2', '고유계정대1') AS COL01,
                               COL02,
                               COL03
    FROM TBL
       ) A
ORDER BY A.COL01, A.COL02, A.COL03

이렇게 하면 특정값 2가 가장 마지막에 붙게 되니 모든게 다 해결이 되네요;; 


by 색즉시공 [2019.04.19 22:28:32]

SELECT COL1,
       COL2,
       COL3
   FROM TBL
ORDER BY DECODE(COL3,2,2,1),COL1, COL2, COL3
 

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