간단한 쿼리 질문 드립니다. 도와주세요. 0 11 1,053

by 유경호 [Oracle 기초] [2013.04.17 15:13:57]



안녕하세요 ~

아래와 같은 데이터가 있습니다.

WITH t1(M) AS
( SELECT 'D01' FROM dual
  UNION ALL
  SELECT 'D02' FROM dual
  UNION ALL
  SELECT 'D03' FROM dual
  UNION ALL
  SELECT 'D04' FROM dual
  UNION ALL
  SELECT 'D05' FROM dual
  .
  .
  .
  n
)

WITH t2(L) AS
( SELECT 'L01' FROM dual
  UNION ALL
  SELECT 'L02' FROM dual
  UNION ALL
  SELECT 'L03' FROM dual
  UNION ALL
  SELECT 'L04' FROM dual
  UNION ALL
  SELECT 'L05' FROM dual
  UNION ALL
  SELECT 'L06' FROM dual
  .
  .
  .
  n

)

이러한 데이터를 가지고 랜덤으로 dispatching을 하는 기능입니다.

원하는 결과는 :

t1.m, t2.l
D01   L01,L06
D02   L02
D03   L03
D04   L04
D05   L05

앞에 t1.m의 값을 개수에 따라 뒤에 오는 t2.l을 주는 겁니다.

고수 님들 도와 주세욤~

by 우리집아찌 [2013.04.17 15:20:31]

컬럼이 무한히 늘어나나요?

by 유경호 [2013.04.17 15:44:55]
컬럼이 안 늘어나구요 그냥 콤마로 구분 지을려구요

by 아발란체 [2013.04.17 15:38:25]

이런건 피벗 기능 보다 가상 쿼리를 만들어서 실행하는게 좋아보입니다.

그리고 질문이 좀 난해한데용,
t1.m의 개수에 따라 뒤에 오는 t2.l을 주는 것?
예시와 내용이 매칭이 잘 안되네용, >ㅅ<)/


by 유경호 [2013.04.17 15:43:48]

죄송합니다. 질문을 잘 못햇어요 컬럼이 늘어안나구요 그냥 콤마로 구분을 지으면 되는겁니다.

by 디케이 [2013.04.17 15:44:35]
 
-- 음.. 의도한게 맞는지 모르겠네요.
WITH 
 T1(M) AS (SELECT 'D' || LPAD(LEVEL, 2, '0') FROM  DUAL CONNECT BY LEVEL <= 5)
,T2(L) AS (SELECT 'L' || LPAD(LEVEL, 2, '0') FROM  DUAL CONNECT BY LEVEL <= 61)

SELECT M
   ,LISTAGG(L, ' ') WITHIN GROUP(ORDER BY L)
FROM  (SELECT M
       ,L
       ,M_RNK
    FROM  (SELECT M
           ,COUNT(1) OVER() M_CNT
           ,ROW_NUMBER() OVER(ORDER BY M) - 1 M_RNK
        FROM  T1) T1
       ,(SELECT L
           ,ROW_NUMBER() OVER(ORDER BY L) - 1 L_RNK
        FROM  T2) T2
    WHERE T1.M_RNK = MOD(T2.L_RNK, T1.M_CNT))
GROUP BY M
     ,M_RNK;

by 우리집아찌 [2013.04.17 15:52:40]

WITH
 T1(M) AS (SELECT 'D' || LPAD(LEVEL, 2, '0') FROM  DUAL CONNECT BY LEVEL <= 5)
,T2(L) AS (SELECT 'L' || LPAD(LEVEL, 2, '0') FROM  DUAL CONNECT BY LEVEL <= 61)
 

SELECT t1.m  , LISTAGG(t2.l, ',') WITHIN GROUP (ORDER BY t2.l)

 FROM
( select  rownum num , t1.*  from t1 ) t1 ,
( select  rownum num , MOD(rownum - 1, (select count(1) from t1 )) + 1  as c  , t2.* from t2 ) t2
WHERE t1.num = t2.c
group by t1.m


by 유경호 [2013.04.17 15:57:41]

디케이님, 우리집아찌님 감사합니다.

두 쿼리 다 제가 원하는 결과가 나왔습니다.

근데 여기서 MOD 함수를 사용하는 이유를 알고 싶습니다.


by 아발란체 [2013.04.17 16:17:28]
MOD(T2.L_RNK, T1.M_CNT)
T2.L_RNK에 1, 2, 3, 4, 5, 6... 식으로 발생하는 값을
전체수(T1.M_CNT)로 나눠서 남은 값(MOD 함수 결과값)이
1이냐, 2이냐, 3이냐에 따라 D01, D02로 배치 되게 하기 위해서 사용하신거 같습니다.

by 우리집아찌 [2013.04.17 15:58:51]

소팅안되서 나와서 수정했어요 ㅜㅜ

by 유경호 [2013.04.17 16:11:37]
감사합니다. ㅋㅋㅋ

by 아발란체 [2013.04.17 16:11:19]
--데이타가 순서대로 있다는 가정하
SELECT
 M, L
FROM
 (SELECT ROWNUM RN, T1.* FROM T1) T1, ( 
 SELECT 
 CEIL(RN / CNT) RN, WM_CONCAT(L) L
 FROM 
 (SELECT COUNT(1) CNT FROM T1) T1,
 (SELECT ROWNUM RN, L FROM T2) T2
 GROUP BY
 CEIL(RN / CNT)
 ) T2
WHERE
 T1.RN = T2.RN
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입