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 41069 게시물 읽기
No. 41069
안녕하세요 오라클 쿼리 질문 드립니다.
작성자
투루로맨스(jung1873)
작성일
2016-02-01 16:37
조회수
8,618

안녕하세요

 

질문 드릴내용은

 

 

 

 

현재 회원테이블 입니다

 

 

 

 

name age contry 탈퇴사유

홍길동1 21 한국 001,002,003,004

홍길동2 22 미국 002

홍길동3 23 호주 004,005,006,007,008

 

 

 

 

 

맨 오른쪽에 보시면 탈퇴사유가 나옵니다.

 

 

 

 

이게 공통 테이블에 데이터와 연관됩니다.

 

 

 

 

공통테이블은

 

SCODE 탈퇴사유

001 그냥

002 모름1

003 모름2

004 모름3

005 모름4

. 모름5

. 모름6

계속 모름7

 

 

 

 

이거를 조인시켜서 다음과 같은 결과가 나와야 합니다.

 

name age contry 탈퇴사유

홍길동1 21 한국 그냥,모름1,모름2,모름3

홍길동2 22 미국 모름1

홍길동3 23 호주 모름3,모름4,모름5

 

 

 

 

 

위와 같이 조인을 시켜서 콤마가 있다면 해당 사유로 뿌려야 합니다.

 

 

 

 

이런게 쿼리로 가능할까요??

 

답변 부탁드립니다.

 

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

일단 저도 초보인점 밝히구요...

오라클을 사용해본적이 없어

MSSQL 기준으로 작성되었습니다..^^;;

 

최적화된 쿼리도 있겠지만..아래 쿼리가 현재 제 한계네요-_-;;;

 

참고만 하세요...

---쿼리시작---

;with 회원(name,age,country,탈퇴사유) As
(
      Select '홍길동1',21,'한국','001,002,003,004'     From tdual  Union All
      Select '홍길동2',22,'미국','002'                 From tdual  Union All
      Select '홍길동3',23,'호주','004,005,006,007,008' From tdual
)
,회원2(seq,name,age,country,탈퇴사유o,탈퇴사유l,탈퇴사유) As
(
      Select 1
            ,a.name
            ,a.age
            ,a.country
            ,a.탈퇴사유
            ,SUBSTRING(a.탈퇴사유,(
                                        Case When IsNull(CharIndex(',',a.탈퇴사유),0) = 0 Then 0
                                             Else IsNull(CharIndex(',',a.탈퇴사유),0) +1
                                        End
                                  )
                                 ,
                                  (
                                        Case When IsNull(CharIndex(',',a.탈퇴사유),0) = 0 Then 0
                                             Else LEN(a.탈퇴사유)
                                        End
                                  )
                     )
            ,SUBSTRING(a.탈퇴사유,1,(
                                        Case When IsNull(CharIndex(',',a.탈퇴사유),0) = 0 Then Len(a.탈퇴사유)
                                             Else IsNull(CharIndex(',',a.탈퇴사유),0) -1
                                        End
                                    )
                      )
        From 회원 a

   Union All

      Select a.seq + 1
            ,a.name
            ,a.age
            ,a.country
            ,a.탈퇴사유o
            ,SUBSTRING(a.탈퇴사유l,(
                                        Case When IsNull(CharIndex(',',a.탈퇴사유l),0) = 0 Then 0
                                             Else IsNull(CharIndex(',',a.탈퇴사유l),0) +1
                                        End
                                  )
                                 ,
                                  (
                                        Case When IsNull(CharIndex(',',a.탈퇴사유l),0) = 0 Then 0
                                             Else LEN(a.탈퇴사유l)
                                        End
                                  )
                     )
            ,SUBSTRING(a.탈퇴사유l,1,(
                                        Case When IsNull(CharIndex(',',a.탈퇴사유l),0) = 0 Then Len(a.탈퇴사유l)
                                             Else IsNull(CharIndex(',',a.탈퇴사유l),0) -1
                                        End
                                    )
                      )
        From 회원2 a
       Where IsNull(a.탈퇴사유l,'') <> ''
)       
,공통테이블(SCODE,탈퇴사유) As
(
      Select '001','그냥'      From tdual Union All
      Select '002','모름1'     From tdual Union All
      Select '003','모름2'     From tdual Union All
      Select '004','모름3'     From tdual Union All
      Select '005','모름4'     From tdual Union All
      Select '006','모름5'     From tdual Union All
      Select '007','모름6'     From tdual Union All
      Select '008','계속모름7' From tdual
)
,회원3(seq,name,age,country,SCODE,탈퇴사유) As
(
      Select 1
            ,a.name
            ,a.age
            ,a.country
            ,Convert(varchar(max),a.탈퇴사유)
            ,Convert(varchar(max),b.탈퇴사유)
        From 회원2 a Inner Join 공통테이블 b On a.탈퇴사유 = b.SCODE
       Where a.seq = 1

   Union All      
      
      Select a.seq
            ,a.name
            ,a.age
            ,a.country
            ,Convert(varchar(max),c.SCODE + ',' + a.탈퇴사유 )
            ,Convert(varchar(max),c.탈퇴사유 + ',' + b.탈퇴사유  )
        From 회원2 a Inner Join 공통테이블 b On a.탈퇴사유 = b.SCODE
                     Inner Join 회원3 c On a.seq = c.seq + 1
                                       And a.name = c.name
                                       And a.age = c.age
                                       And a.country = c.country
)      

    Select a.name
          ,a.age
          ,a.country
          ,a.SCODE As SCODE
          ,MAX(a.탈퇴사유) As 탈퇴사유
      From 회원3 a
     Where a.seq = (
                      Select
                       Top 1 x.seq
                        From 회원3 x
                       Where a.age = x.age
                         And a.country = x.country
                         And a.name = x.name
                    Order By x.seq Desc
                   )
  Group By a.name
          ,a.age
          ,a.country
          ,a.SCODE
         
---쿼리끝---

최한영(terry0515)님이 2016-02-01 19:38에 작성한 댓글입니다.

WITH code_t AS
(
SELECT '001' scode, '그냥' sname FROM dual
UNION ALL SELECT '002', '모름1' FROM dual
UNION ALL SELECT '003', '모름2' FROM dual
UNION ALL SELECT '004', '모름3' FROM dual
UNION ALL SELECT '005', '모름4' FROM dual
UNION ALL SELECT '006', '모름5' FROM dual
UNION ALL SELECT '007', '모름6' FROM dual
UNION ALL SELECT '008', '모름7' FROM dual
)
, data_t AS
(
SELECT '홍길동2' name, 22 age, '미국' contry, '002' scode FROM dual
UNION ALL SELECT '홍길동1', 21, '한국', '001,002,003,004' FROM dual
UNION ALL SELECT '홍길동3', 23, '호주', '004,005,006,007,008' FROM dual
)
SELECT d.name, d.age, d.contry
     , LISTAGG(c.sname, ',')
       WITHIN GROUP(ORDER BY INSTR(d.scode, c.scode)) sname
  FROM data_t d
     , code_t c
 WHERE INSTR(d.scode, c.scode) > 0
 GROUP BY d.name, d.age, d.contry
 ORDER BY d.name, d.age, d.contry
;

마농(manon94)님이 2016-02-05 11:41에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41073데이터베이스 초보입니다. 공부하는 방법을 알려주시면 감사하겠습니다. [2]
정준모
2016-02-12
8940
41072계층형 쿼리에 조건에 다한 출력 질문 ㅠ [2]
박양희
2016-02-11
8568
41071간단하지만 명확하지 않아서 질문합니다. procedure function package 시에
임경수
2016-02-11
7872
41069안녕하세요 오라클 쿼리 질문 드립니다. [2]
투루로맨스
2016-02-01
8618
41068쿼리 ID가 같으면 값을 SUM 하는 거요. [1]
전설종이
2016-01-30
7974
41067rank 맨위 1위,2위 마지막 1윌,2위 [1]
초보
2016-01-29
8233
41065INNER JOIN [2]
입문자
2016-01-28
7654
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다