DATOR


유용한 SQL문(여려개의 결과값을 하나의 ROW로 보여주기)

프로젝트를 하다보면 여러개의 결과값을 하나의 ROW로 보여 달라고 요청하는 경우가 종종 있다.
아래 부분의 SQL은 이런 요구사항이 나왔을 경우에 활용할수 있는 SQL이다.

 

가정)

 

1. 샘플 데이터 생성

CREATE TABLE HJ_SAMPLE_TEST
AS
SELECT OBJECT_ID,OBJECT_NAME
  FROM ALL_OBJECTS
WHERE OWNER='SYS'
AND ROWNUM<=8
ORDER BY OBJECT_ID

 

2.샘플데이터 VIEW

 

SELECT *
 FROM HJ_SAMPLE_TEST

 

Object_id Object_name
2          C_OBJ#
3          I_OBJ#
4          TAB$
5          CLU$
6          C_TS#
7          I_TS#
8          C_FILE#_BLOCK#
9          I_FILE#_BLOCK#

 

3.2번의 결과 값을 아래와 같이 나오기를 희망 한다고 한다면?

 

결과값)
C_OBJ#,I_OBJ#,TAB$,CLU$,C_TS#,I_TS#,C_FILE#_BLOCK#,C_FILE#_BLOCK#

즉 결과값의 ROWS의수를 하나의 ROW로 보여 주기를 원한다.
결과값의 갯수는 조회의 결과에 따라서 항상 가변적이다라는 가정임.(고정을 하지 않음)


4.작성 SQL

 

SELECT SUBSTRB(VALUE_CD,2) AS VALUE_CD
      ,SUBSTRB(VALUE_NM,2) AS VALUE_NM
FROM (
SELECT A2.*
      ,SYS_CONNECT_BY_PATH(OBJECT_ID, ',') VALUE_CD
      ,SYS_CONNECT_BY_PATH(OBJECT_NAME, ',') VALUE_NM
      ,ROW_NUMBER() OVER (ORDER BY CNT DESC) MAX_CNT
 FROM (
SELECT  A1.*
       ,LAG(CNT) OVER (ORDER BY CNT) BEFORE_CNT
 FROM (
               SELECT  OBJECT_ID
                               ,OBJECT_NAME
                              ,ROW_NUMBER() OVER (ORDER BY OBJECT_ID) AS CNT
                  FROM  HJ_SAMPLE_TEST
               ) A1
          ) A2
  START WITH BEFORE_CNT IS NULL
  CONNECT BY PRIOR CNT = BEFORE_CNT
  )
WHERE MAX_CNT=1 

 

결과값)

 

Value_cd              Value_nm
2,3,4,5,6,7,8,9        C_OBJ#,I_OBJ#,TAB$,CLU$,C_TS#,I_TS#,C_FILE#_BLOCK#,I_FILE#_BLOCK#


5.SQL의 작성 방법

 순환전개의 개념을 이용해서 작성한것입니다.
 순환전개의 개념에 대해서 참조하세요..
 
 
도움이 되시기를 바랍니다.

Tag

Leave Comments