티베로 조회된 열의 값을 컬럼으로 사용가능한가요 0 3 1,776

by 수지구보안관 [Tibero] [2022.12.01 17:39:52]


티베로 조회된 열의 값을 컬럼명으로 사용하기 위한 쿼리입니다.

조회된 열의 값이 100개 이상이 되어 하드코딩으로 어려워 혹시 IN절에

SELECT 값을넣을 수 있나 했으나. 티베로는 불가능한것 같아 문의드립니다.

고수님들 제발 알려주세요.

 

SELECT DETECT_IRDNT_NM
,	   NVL(CROPS1,0) CROPS1
,	   NVL(CROPS2,0) CROPS2
,	   NVL(CROPS3,0) CROPS3
,	   NVL(CROPS4,0) CROPS4
,	   NVL(CROPS5,0) CROPS5
,	   NVL(CROPS6,0) CROPS6
,	   NVL(CROPS7,0) CROPS7
,	   NVL(CROPS8,0) CROPS8
,	   NVL(CROPS9,0) CROPS9
,	   NVL(CROPS10,0) CROPS10
,	   NVL(CROPS11,0) CROPS11
,      NVL(CROPS1,0) + NVL(CROPS2,0) + NVL(CROPS3,0) + NVL(CROPS4,0) + NVL(CROPS5,0) + NVL(CROPS6,0) + NVL(CROPS7,0) +
       NVL(CROPS8,0) + NVL(CROPS9,0) + NVL(CROPS10,0) + NVL(CROPS11,0) AS TOTAL
  FROM (
  		SELECT ROWNUM AS RNUM
  		,      A.*
  		  FROM (
		  		SELECT *
				  FROM A_TABLE	
				  PIVOT (SUM(CNT) FOR CNTC_PRDLST_NM 
				                                     IN ('딸기' AS CROPS1 ,'레드향'AS CROPS2, 
                                                                           '방아' AS CROPS3,'방울토마토' AS 
                                                                          CROPS4, '배' AS CROPS5, '배추' AS 
                                                                          CROPS6, '브로코리' AS CROPS7 ,'시금 
                                                                          치' AS CROPS8, '열무' AS CROPS9 ,'토 
                                                                          마토' AS CROPS10, '파프리카' AS 
                                                                          CROPS11
				                                        ))
				         )
			    ) A 
		  
  
        ) T		
;

 

by jason kim [2022.12.01 17:52:41]

서브쿼리 사용하시면 가능합니다.


by 마농 [2022.12.01 22:34:41]

행을 열로 전환하는 피벗 형태의 집계쿼리는
전환하는 값이 이미 정해져 있는 경우에만 SQL로 가능합니다.
동적으로 변하는 값에 대해서는 정적쿼리로는 안됩니다. 동적쿼리를 사용하셔야 됩니다.


by 마농 [2022.12.02 08:40:55]

지금 작성된 쿼리를 보면 구분 항목들은 하드코딩되고 있지만
컬럼명칭은 해당 명칭이 아닌 그냥 순번 형태로 되어 있네요?
컬럼명을 해당 명칭이 아닌 단순 순번형태로 가고자 한다면 하드코딩을 줄이는 방안은 있습니다.
코드테이블이 별도로 있다고 가정하면 다음과 같이 코드에 순번을 부여해서 피벗하면 됩니다.
그리고 NVL 처리 및 전체 더하기 처리를 추가로 해야 한다면
피벗보다는 차라리 전통방식(Group By, decode)이 편리합니다.
 

SELECT a.detect_irdnt_nm
     , NVL(SUM(DECODE(b.rn,  1, a.cnt)), 0) crops1
     , NVL(SUM(DECODE(b.rn,  2, a.cnt)), 0) crops2
     , NVL(SUM(DECODE(b.rn,  3, a.cnt)), 0) crops3
     , NVL(SUM(DECODE(b.rn,  4, a.cnt)), 0) crops4
     , NVL(SUM(DECODE(b.rn,  5, a.cnt)), 0) crops5
     , NVL(SUM(DECODE(b.rn,  6, a.cnt)), 0) crops6
     , NVL(SUM(DECODE(b.rn,  7, a.cnt)), 0) crops7
     , NVL(SUM(DECODE(b.rn,  8, a.cnt)), 0) crops8
     , NVL(SUM(DECODE(b.rn,  9, a.cnt)), 0) crops9
     , NVL(SUM(DECODE(b.rn, 10, a.cnt)), 0) crops10
     , NVL(SUM(DECODE(b.rn, 11, a.cnt)), 0) crops11
     , SUM(a.cnt) total
  FROM a_table a
     , (SELECT ROW_NUMBER() OVER(ORDER BY cntc_prdlst_nm) rn
             , cntc_prdlst_nm
          FROM code_t
        ) b
 WHERE a.cntc_prdlst_nm = b.cntc_prdlst_nm
 GROUP BY a.detect_irdnt_nm
;

 

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