도움이 필요합니다. oracle 쿼리 문의. 0 9 1,211

by 고수로. [2019.09.25 09:50:40]


안녕하세요.

쿼리에서 해결이 가능하다면 좀 수월하게 표현이 될 것 같아 알아보았지만 능력 부족으로

도움을 좀 받고자 문의를 드릅니다.

아래와 같은 형태의 데이터가 있습니다.

Col1 COL2 Col3 Col4 Col5
FAX 회사1 024445555 TEST 20190925
FAX 회사1 025556645 TEST2 20190926
EMAIL 회사2 test1@naver.com TEST3 20190901
EMAIL 회사2 test2@naver.com TEST4 20190902
EMAIL 회사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
EMAIL 회사2 test1@naver.com TEST3 20190901
EMAIL 회사2 test2@naver.com TEST4 20190902
EMAIL 회사3 EMAIL 회사3 EMAIL 회사3 EMAIL 회사3 EMAIL 회사3
EMAIL 회사3 test3@naver.com TEST4 20190903

혹시 Group by를 하지 않고 위와 같이 파란색 형태의 상단에 데이터 표출이 가능할까요.

감사합니다.

by 소주쵝오 [2019.09.25 11:22:40]
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

;

 


by 고수로. [2019.09.25 12:45:07]

도움 감사합니다.

참고해보겠습니다.^^ 좋은하루 되세요


by jkson [2019.09.25 11:33:29]

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

 


by 고수로. [2019.09.25 12:45:33]

도움 감사합니다.

참고해보겠습니다.^^ 

혹시 그룹바이로 하게되면 좀 더 편히 만들수 있을까요.

Group by 용 샘플도 좀 부탁드려도 괜찮을까요..ㅜㅜ


by 마농 [2019.09.25 13:36:35]
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
;

 


by 고수로. [2019.09.25 16:01:18]

감사합니다.^^.

참고해보겠습니다. 좋은하루 되세요


by jkson [2019.09.25 14:16:29]

마농님

처음에 이렇게 만들었는데 

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

 


by jkson [2019.09.25 14:24:41]

아 알았습니다. order by 에 col3부분에 alias가 빠졌었네요 ㅠㅠ


by 고수로. [2019.09.25 16:01:03]

감사합니다.^^.

참고해보겠습니다. 좋은하루 되세요

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