database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41634 게시물 읽기
No. 41634
매트릭스 자료작성(c,r,u,d) 급질문
작성자
입문자
작성일
2018-09-13 23:27ⓒ
2018-09-14 00:50ⓜ
조회수
3,926

 안녕하세요. 도저히 답이 안나와 올려봅니다.

엑셀에

메뉴id insert Update Delete Select Select Select      
Aaa T1     T2    T4      
Bbb                  
Ccc     T1   T2        
Ddd T3                
Eeee       T1          
Fff            T4      
Gff   T2   T3 T2        
Hjjj   T1              
Iiii         T3        

위형태로 작업후 그대로 테이블로 밀어넣었고 그 뒤에

 

메뉴id T1 T2 T3 T4          
Aaa C  S   S          
Bbb                  
Ccc  D  S              
Ddd      C            
Eeee  S                
Fff        S          
Gff   US  S            
Hjjj  U                
Iiii      S      

위와 같은 형태로 쿼리를 짜려고 합니다. listagg 로 중복도 제거하고 한 low로 만들기는 했지만 전체적으로 감이 오지 않습니다.

고수님들 의견 부탁드립니다.

쿼리 아니면 수작업 해야합니다 ㅠ 제발 도와주십시요.

 

 

이 글에 대한 댓글이 총 4건 있습니다.

SELECT a.메뉴ID,

max(case when a.INSERT = b.COL and b.COL = 'T1' THEN 'C' end) ||

max(case when a.UPDATE = b.COL and b.COL = 'T1' THEN 'U' end) ||

max(case when a.DELETE = b.COL and b.COL = 'T1' THEN 'D' end) ||

max(case when a.SELECT1 = b.COL and b.COL = 'T1' THEN 'S' end) ||

max(case when a.SELECT2 = b.COL and b.COL = 'T1' THEN 'S' end) ||

max(case when a.SELECT3 = b.COL and b.COL = 'T1' THEN 'S' end)

as T1,

max(case when a.INSERT = b.COL and b.COL = 'T2' THEN 'C' end) ||

max(case when a.UPDATE = b.COL and b.COL = 'T2' THEN 'U' end) ||

max(case when a.DELETE = b.COL and b.COL = 'T2' THEN 'D' end) ||

max(case when a.SELECT1 = b.COL and b.COL = 'T2' THEN 'S' end) ||

max(case when a.SELECT2 = b.COL and b.COL = 'T2' THEN 'S' end) ||

max(case when a.SELECT3 = b.COL and b.COL = 'T2' THEN 'S' end)

as T2,

max(case when a.INSERT = b.COL and b.COL = 'T3' THEN 'C' end) ||

max(case when a.UPDATE = b.COL and b.COL = 'T3' THEN 'U' end) ||

max(case when a.DELETE = b.COL and b.COL = 'T3' THEN 'D' end) ||

max(case when a.SELECT1 = b.COL and b.COL = 'T3' THEN 'S' end) ||

max(case when a.SELECT2 = b.COL and b.COL = 'T3' THEN 'S' end) ||

max(case when a.SELECT3 = b.COL and b.COL = 'T3' THEN 'S' end)

as T3,

max(case when a.INSERT = b.COL and b.COL = 'T4' THEN 'C' end) ||

max(case when a.UPDATE = b.COL and b.COL = 'T4' THEN 'U' end) ||

max(case when a.DELETE = b.COL and b.COL = 'T4' THEN 'D' end) ||

max(case when a.SELECT1 = b.COL and b.COL = 'T4' THEN 'S' end) ||

max(case when a.SELECT2 = b.COL and b.COL = 'T4' THEN 'S' end) ||

max(case when a.SELECT3 = b.COL and b.COL = 'T4' THEN 'S' end)

as T4

 

FROM table a

LEFT OUTER JOIN

(

SELECT 메뉴ID, INSERT AS COL FROM table WHERE INSERT IS NOT NULL

UNION

SELECT 메뉴ID, UPDATE AS COL FROM table WHERE UPDATE IS NOT NULL

UNION

SELECT 메뉴ID, DELETE AS COL FROM table WHERE DELETE IS NOT NULL

UNION

SELECT 메뉴ID, SELECT1 AS COL FROM table WHERE SELECT1 IS NOT NULL

UNION

SELECT 메뉴ID, SELECT2 AS COL FROM table WHERE SELECT2 IS NOT NULL

UNION

SELECT 메뉴ID, SELECT3 AS COL FROM table WHERE SELECT3 IS NOT NULL

) b

on a.메뉴ID = b.메뉴ID

GROUP BY a.메뉴ID

ORDER BY a.메뉴ID

윤승환(felcon00)님이 2018-09-14 11:30에 작성한 댓글입니다.
이 댓글은 2018-09-14 15:07에 마지막으로 수정되었습니다.

와~ 감사합니다^^  많은 도움이 됐습니다.

그런데 테이블수가 500개인자라 일일이 명시해서 하기에는 어려움이 있을듯합니다.

참고해서 해볼께요~ 감사합니다^^

 

입문자님이 2018-09-16 22:01에 작성한 댓글입니다. Edit

select 메뉴ID,

case when insert = 'T1' THEN 'C' END ||

case when update = 'T1' THEN 'U' END ||

case when delete = 'T1' THEN 'D' END ||

case when select1 = 'T1' THEN 'S' END ||

case when select2 = 'T1' THEN 'S' END ||

case when select3 = 'T1' THEN 'S' END AS T1,

case when insert = 'T2' THEN 'C' END ||

case when update = 'T2' THEN 'U' END ||

case when delete = 'T2' THEN 'D' END ||

case when select1 = 'T2' THEN 'S' END ||

case when select2 = 'T2' THEN 'S' END ||

case when select3 = 'T2' THEN 'S' END AS T2,

case when insert = 'T3' THEN 'C' END ||

case when update = 'T3' THEN 'U' END ||

case when delete = 'T3' THEN 'D' END ||

case when select1 = 'T3' THEN 'S' END ||

case when select2 = 'T3' THEN 'S' END ||

case when select3 = 'T3' THEN 'S' END AS T3,

case when insert = 'T4' THEN 'C' END ||

case when update = 'T4' THEN 'U' END ||

case when delete = 'T4' THEN 'D' END ||

case when select1 = 'T4' THEN 'S' END ||

case when select2 = 'T4' THEN 'S' END ||

case when select3 = 'T4' THEN 'S' END AS T4

from 테이블

 

제가 너무 어렵게 생각했네요.

단순하게 만들수 있었는데.

윤승환(felcon00)님이 2018-09-17 10:28에 작성한 댓글입니다.

WITH t AS
(
SELECT 'Aaa' id, 'T1' ins, '' upd, '' del, 'T2' sel1, '' sel2, 'T4' sel3 FROM dual
UNION ALL SELECT 'Bbb' , ''  , ''  , ''  , ''  , ''  , ''   FROM dual
UNION ALL SELECT 'Ccc' , ''  , ''  , 'T1', ''  , 'T2', ''   FROM dual
UNION ALL SELECT 'Ddd' , 'T3', ''  , ''  , ''  , ''  , ''   FROM dual
UNION ALL SELECT 'Eeee', ''  , ''  , ''  , 'T1', ''  , ''   FROM dual
UNION ALL SELECT 'Fff' , ''  , ''  , ''  , ''  , ''  , 'T4' FROM dual
UNION ALL SELECT 'Gff' , ''  , 'T2', ''  , 'T3', 'T2', ''   FROM dual
UNION ALL SELECT 'Hjjj', ''  , 'T1', ''  , ''  , ''  , ''   FROM dual
UNION ALL SELECT 'Iiii', ''  , ''  , ''  , ''  , 'T3', ''   FROM dual
)
SELECT *
  FROM t
 UNPIVOT (v FOR gb IN ( ins  AS 'C', upd  AS 'U', del  AS 'D'
                      , sel1 AS 'S', sel2 AS 'S', sel3 AS 'S') )
 PIVOT (LISTAGG(gb) WITHIN GROUP(ORDER BY INSTR('CUDS', gb))
        FOR v IN ('T1' t1, 'T2' t2, 'T3' t3, 'T4' t4))
 ORDER BY id
;

마농(manon94)님이 2018-09-17 13:18에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41637SELECT에서의 NULL 때문에 계산이 오류가 납니다. [3]
애기씨
2018-10-01
3474
41636특정 테이블의 컬럼별 데이터 조회 [2]
k62511
2018-09-29
3384
41635문자열 변환 문의드립니다. [8]
김대훈
2018-09-27
3785
41634매트릭스 자료작성(c,r,u,d) 급질문 [4]
입문자
2018-09-13
3926
41633첫쨰주 토요일과 셋째주 토요일을 구하는 문제인데요 .. [2]
이병훈
2018-09-12
3695
41632세로데이터를 가로로 변환 부탁드립니다 [1]
블루이글
2018-09-11
4241
41631패키지 내에서 패키지 호출방법 [1]
도와주세요
2018-09-10
3421
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다