쿼리질문이요(일련번호별로 사용자ID별 갯수만큼 자동으로 찍어주는부분) 0 1 1,498

by 무뚝이 [SQLServer] [2013.03.17 02:19:20]


사용자테이블에 3개 아이디(A,B,C)와

일련번호테이블이 있다고 할때

사용자ID별 개수만큼 일련번호테이블의 사용자ID를 채워주는것입니다.

이런것도 한방의 쿼리로 가능할까요?

이것도 뺑뺑이 돌려서 처리하긴했지만,, 속도가 넘 느리네요.



일련번호테이블 사용자테이블
일련번호 사용자ID 사용자ID 개수
5 NULL A 2
8 NULL B 5
11 NULL C 3
14 NULL
17 NULL
19 NULL
20 NULL
21 NULL
23 NULL
24 NULL
반영된 결과테이블
일련번호 사용자ID
5 A
8 A
11 B
14 B
17 B
19 B
20 B
21 C
23 C
24 C



by 아린 [2013.03.17 10:26:36]
조금만 응용하시면 될듯한데요.

사용자그룹테이블 쪽만 수정하시면 됩니다.


WITH 일련번호테이블(일련번호, 사용자ID, 그룹코드) AS(   
SELECT  5, NULL, '0001' FROM dual UNION ALL        
SELECT  8, NULL, '0001' FROM dual UNION ALL
SELECT 11, NULL, '0001' FROM dual UNION ALL
SELECT 14, NULL, '0001' FROM dual UNION ALL
SELECT 17, NULL, '0001' FROM dual UNION ALL
SELECT 19, NULL, '0001' FROM dual UNION ALL
SELECT 20, NULL, '0001' FROM dual UNION ALL
SELECT 21, NULL, '0001' FROM dual UNION ALL
SELECT 23, NULL, '0001' FROM dual UNION ALL
SELECT 24, NULL, '0001' FROM dual
), 사용자그룹테이블(그룹코드, 사용자ID, 갯수) AS(
SELECT '0001', 'A', 2 FROM dual UNION ALL
SELECT '0001', 'B', 5 FROM dual UNION ALL
SELECT '0001', 'C', 3 FROM dual
)
SELECT a.일련번호, a.그룹코드 
     , REGEXP_SUBSTR(b.사용자id, '[^,]+', 1
                   , DECODE(MOD(rn, usr_cnt)
                   , 0, usr_cnt
                   , MOD(rn, usr_cnt)) ) usrid
  FROM (SELECT 일련번호, 사용자ID, 그룹코드
             , ROW_NUMBER() OVER(ORDER BY 일련번호) rn
          FROM 일련번호테이블
         WHERE 그룹코드 = '0001' 
        ) a 
     , (SELECT LISTAGG(RTRIM(REPLACE(LPAD('x', 갯수, 'x'), 'x'
               , 사용자ID||','), ','), ',')
 
               WITHIN GROUP(ORDER BY 사용자id) 사용자id
             , SUM(갯수) usr_cnt
          FROM 사용자그룹테이블
         WHERE 그룹코드 = '0001'
        ) b  
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입