컬럼 나누기 문의 드립니다. 3

by llgxj [SQL Query] [2024.05.10 10:37:31]



WITH m_data
AS
(
	SELECT col_nm,COMMENTS
		,(LENGTH(COL_NM) - LENGTH(REPLACE(COL_NM, '_', '')) + 1) AS CNT
	from(
		SELECT 'COL_QTY_1' AS COL_NM, '컬럼1' AS COMMENTS
		FROM DUAL
		UNION ALL
		SELECT 'COL_QTY_2' AS COL_NM, '컬럼2' AS COMMENTS
		FROM DUAL
		UNION ALL
		SELECT 'COL_QTY_AMT_1' AS COL_NM, '컬럼금액1' AS COMMENTS
		FROM DUAL
		UNION ALL
		SELECT 'AMT1' AS COL_NM, '금액1' AS COMMENTS
		FROM DUAL
	)
)
SELECT *
FROM(
	SELECT ROW_NUMBER() OVER ( PARTITION BY col_nm ORDER BY LEVEL) AS RN, LEVEL,M.*
	FROM M_DATA M
	WHERE 1=1
	CONNECT BY LEVEL <= CNT
	ORDER BY col_nm,LEVEL
)
WHERE 1=1
  AND RN <= CNT
ORDER BY col_nm

이렇게 까지작성은했는데 샘플말고 실제 테이블가지고 조회할떄는 너무 오래걸리는데요 혹시 속도 향상시키면서 아래 원하게 나올수 있을까요?

여기 col_nm 조회를 해보시면 "_" 조합으로 이루어져있습니다.

그래서 cnt 만큼 나눠주려고 합니다.(as_is 컬럼을 가지고 단어를 만드려는 작업)

ex) COL_QTY_AMT_1

-- 로우를

col 컬럼금액1

qty 컬럼금액1

amt 컬럼금액1

1 컬럼금액1

이렇게 나눠서 조회르하려고합니다.

어떤식으로 쿼리를 짜야 될까요??

by 마농 [2024.05.10 11:20:50]

Connect By LEVEL 을 이용한 행 복제 방식은
dual 처럼 1행의 자료에 적용하는 방식입니다.
여러건의 자료에 바로 적용하면 기하급수로 복제됩니다.
http://gurubee.net/article/55635


by llgxj [2024.05.10 13:22:02]
WITH m_data

AS

(

SELECT col_nm,COMMENTS

,(LENGTH(COL_NM) - LENGTH(REPLACE(COL_NM, '_', '')) + 1) AS CNT

from(

SELECT 'COL_QTY_1' AS COL_NM, '컬럼1' AS COMMENTS

FROM DUAL

UNION ALL

SELECT 'COL_QTY_2' AS COL_NM, '컬럼2' AS COMMENTS

FROM DUAL

UNION ALL

SELECT 'COL_QTY_AMT_1' AS COL_NM, '컬럼금액1' AS COMMENTS

FROM DUAL

UNION ALL

SELECT 'AMT1' AS COL_NM, '금액1' AS COMMENTS

FROM DUAL

)

)

/*

원라는 데이타는 col_qty_1일때

"_"를 기준으로 아래처럼 로우를 나누려고합니다. 그래서 INSTR(COL_NM, '_', 1, lv) 이거 가지고 몇번째인지는 확인했는데 아래처럼 나누려면 어떻게 해야될까요?

col

qty

1



*/

SELECT LV

,COL_NM

,COMMENTS

,CNT

,INSTR(COL_NM, '_', 1, lv)

FROM

(

SELECT LEVEL AS LV

FROM DUAL

WHERE 1=1

CONNECT BY LEVEL <= 10 -- 10개이상은 없어서 강제 처리

) M LEFT OUTER JOIN M_DATA S

ON M.LV <= S.CNT

WHERE 1=1

-- AND CNT = 4

AND COL_NM IS NOT null

ORDER BY COL_NM,LV;

 


by 마농 [2024.05.10 14:52:14]
WITH m_data AS
(
SELECT 'COL_QTY_1' col_nm, '컬럼1' comments FROM dual
UNION ALL SELECT 'COL_QTY_2'    , '컬럼2'     FROM dual 
UNION ALL SELECT 'COL_QTY_AMT_1', '컬럼금액1' FROM dual
UNION ALL SELECT 'AMT1'         , '금액1'     FROM dual
)
SELECT col_nm
     , comments
     , lv
     , REGEXP_SUBSTR(col_nm, '[^_]+', 1, lv) x
  FROM m_data
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= LENGTH(col_nm) - LENGTH(REPLACE(col_nm, '_')) + 1
 ORDER BY col_nm, lv
;

 

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