안녕하세요.
쿼리에서 해결이 가능하다면 좀 수월하게 표현이 될 것 같아 알아보았지만 능력 부족으로
도움을 좀 받고자 문의를 드릅니다.
아래와 같은 형태의 데이터가 있습니다.
Col1 | COL2 | Col3 | Col4 | Col5 |
FAX | 회사1 | 024445555 | TEST | 20190925 |
FAX | 회사1 | 025556645 | TEST2 | 20190926 |
회사2 | test1@naver.com | TEST3 | 20190901 | |
회사2 | test2@naver.com | TEST4 | 20190902 | |
회사3 | test3@naver.com | TEST4 | 20190903 |
위 데이터와 같은 형태가 있습니다. Order by 를 Col1, Col2로 주다보니 저런식으로 표출이 되는데요
해보고자 하는방법은 아래와 같습니다.
(즉 Col1, Col2 기준으로 상단에 Col1 정보와 Col2정보를 추가로 표출)
Col1 | COL2 | Col3 | Col4 | Col5 |
FAX 회사1 | FAX 회사1 | FAX 회사1 | FAX 회사1 | FAX 회사1 |
FAX | 회사1 | 024445555 | TEST | 20190925 |
FAX | 회사1 | 025556645 | TEST2 | 20190926 |
EMAIL 회사2 | EMAIL 회사2 | EMAIL 회사2 | EMAIL 회사2 | EMAIL 회사2 |
회사2 | test1@naver.com | TEST3 | 20190901 | |
회사2 | test2@naver.com | TEST4 | 20190902 | |
EMAIL 회사3 | EMAIL 회사3 | EMAIL 회사3 | EMAIL 회사3 | EMAIL 회사3 |
회사3 | test3@naver.com | TEST4 | 20190903 |
혹시 Group by를 하지 않고 위와 같이 파란색 형태의 상단에 데이터 표출이 가능할까요.
감사합니다.
with wt as (select 'FAX' col1, '회사1' col2, '024445555' col3, 'TEST' col4, '20190925' col5 from dual union all select 'FAX', '회사1', '025556645', 'TEST2', '20190926' from dual union all select 'EMAIL', '회사2', 'test1@naver.com', 'TEST3', '20190901' from dual union all select 'EMAIL', '회사2', 'test2@naver.com', 'TEST4', '20190902' from dual union all select 'EMAIL', '회사3', 'test3@naver.com', 'TEST5', '20190903' from dual ) select t.* from (select * from wt union all select distinct col1||' '||col2, col1||' '||col2, col1||' '||col2, col1||' '||col2, col1||' '||col2 from wt ) t order by regexp_replace(col2, '[^[:digit:]]', '') , regexp_replace(col1, '[^[:digit:]]', '') , col5 ;
group by 사용하면 편하게 만들 수 있는데 굳이 안 쓰시려는 이유가 있나요?
with t (Col1, COL2, Col3, Col4, Col5) as ( select 'FAX', '회사1', '24445555', 'TEST', '20190925' from dual union all select 'FAX', '회사1', '25556645', 'TEST2', '20190926' from dual union all select 'EMAIL', '회사2', 'test1@naver.com', 'TEST3', '20190901' from dual union all select 'EMAIL', '회사2', 'test2@naver.com', 'TEST4', '20190902' from dual union all select 'EMAIL', '회사3', 'test3@naver.com', 'TEST4', '20190903' from dual ) select decode(gb,1,col1|| ' ' || col2,col1) as col1 , decode(gb,1,col1|| ' ' || col2,col2) as col2 , decode(gb,1,col1|| ' ' || col2,col3) as col3 , decode(gb,1,col1|| ' ' || col2,col4) as col4 , decode(gb,1,col1|| ' ' || col2,col5) as col5 from ( select col1, col2, col3, col4, col5, grouping(col3) as gb from t group by rollup((col1, col2), (col3, col4, col5)) having grouping(col1) != 1 ) a order by a.col1 desc, a.col2, gb desc
WITH t1 AS ( SELECT 'FAX' c1, '회사1' c2, '024445555' c3, 'TEST' c4, '20190925' c5 FROM dual UNION ALL SELECT 'FAX' , '회사1', '025556645' , 'TEST2', '20190926' FROM dual UNION ALL SELECT 'EMAIL', '회사2', 'test1@naver.com', 'TEST3', '20190901' FROM dual UNION ALL SELECT 'EMAIL', '회사2', 'test2@naver.com', 'TEST4', '20190902' FROM dual UNION ALL SELECT 'EMAIL', '회사3', 'test3@naver.com', 'TEST4', '20190903' FROM dual ) SELECT DECODE(GROUPING(c5), 1, c1 ||' '||c2, c1) c1 , DECODE(GROUPING(c5), 1, c1 ||' '||c2, c2) c2 , DECODE(GROUPING(c5), 1, c1 ||' '||c2, c3) c3 , DECODE(GROUPING(c5), 1, c1 ||' '||c2, c4) c4 , DECODE(GROUPING(c5), 1, c1 ||' '||c2, c5) c5 FROM t1 a GROUP BY c2, c1, ROLLUP((c5, c3, c4)) ORDER BY a.c2, a.c1, GROUPING(a.c5) DESC, a.c5 ;
마농님
처음에 이렇게 만들었는데
group by 오류가 나서 인라인뷰로 바꿨는데요.
신기한 건 col3 decode 부분을 빼면 안 나는데 왜 그럴까요? 그냥 버그인지..
마농님처럼 col1, col2를 rollup에서 빼도 그렇고;;
형태는 거의 비슷한데;;
with t (Col1, COL2, Col3, Col4, Col5) as ( select 'FAX', '회사1', '24445555', 'TEST', '20190925' from dual union all select 'FAX', '회사1', '25556645', 'TEST2', '20190926' from dual union all select 'EMAIL', '회사2', 'test1@naver.com', 'TEST3', '20190901' from dual union all select 'EMAIL', '회사2', 'test2@naver.com', 'TEST4', '20190902' from dual union all select 'EMAIL', '회사3', 'test3@naver.com', 'TEST4', '20190903' from dual ) select decode( grouping(col3),1,col1|| ' ' || col2,col1) as col1 , decode( grouping(col3),1,col1|| ' ' || col2,col2) as col2 --, decode( grouping(col3),1,col1|| ' ' || col2,col3) as col3 , decode( grouping(col3),1,col1|| ' ' || col2,col4) as col4 , decode( grouping(col3),1,col1|| ' ' || col2,col5) as col5 from t a group by rollup((col1, col2), (col3, col4, col5)) having grouping(col1) != 1 order by a.col1 desc, a.col2, grouping(col3) desc