특정 from, to값을 입력받아 그 사이 수치를 모두 가로로 출력할려면 0 1 2,044

by 메로나 [2024.01.09 15:10:31]


p_to : 240

 

NAME    HGROUP LGROUP   ITEM
해병      H1    1       Pam
해병      H2    2       Cm
해병      H2    3       Das
해병      H3    5       IPaq
해병      H4    6       Goal
해병      H4    7       Leg
해병      H6    8       Power
해병      H6    9       Stick
해병      H7    10      Mental

...........
해병     H10    N       Siru

이런데이터가 있는데요
HGROUP은 10개가 고정입니다 (HGROUP은 비어있거나 중복이 될 수 있지만 10개가 MAX)
LGROUP은 중간에 빈값이 있을 수 있습니다. (LGROUP은 N개까지)

가로로 나열 시
HGROUP은 비어 있으면 "X다음순번" 로 표기가 되어야 됩니다.

LGROUP은 비어 있으면 "X다음순번" 로 표기가 되어야 됩니다.

          HGROUP부분                   LGROUP부분
     ___________________________   ___________________________
해병 H1 H2 H3 H4 X5  H6 .... H10   1 2 3 X4 5 6 7 8 9 .... N


p_to 값에 따라 N이 늘어납니다. 만약 240이면 LGROUP은 1에서 240까지가 가로로 쭉 나열 되어야 됩니다.

이름    HGROUP(무조건10개)     LGROUP(N개)

by 마농 [2024.01.09 17:04:47]
WITH data_t AS
(
SELECT '해병' name, 'H1' hgroup, 1 lgroup, 'Pam' item FROM dual
UNION ALL SELECT '해병', 'H2' ,  2, 'Cm'     FROM dual
UNION ALL SELECT '해병', 'H2' ,  3, 'Das'    FROM dual
UNION ALL SELECT '해병', 'H3' ,  5, 'IPaq'   FROM dual
UNION ALL SELECT '해병', 'H4' ,  6, 'Goal'   FROM dual
UNION ALL SELECT '해병', 'H4' ,  7, 'Leg'    FROM dual
UNION ALL SELECT '해병', 'H6' ,  8, 'Power'  FROM dual
UNION ALL SELECT '해병', 'H6' ,  9, 'Stick'  FROM dual
UNION ALL SELECT '해병', 'H7' , 10, 'Mental' FROM dual
UNION ALL SELECT '해병', 'H10', 11, 'Siru'   FROM dual
UNION ALL SELECT '해병', 'H10', 24, 'Siru'   FROM dual
UNION ALL SELECT '육군', 'H1' ,  1, 'aaaa'   FROM dual
)
SELECT h.name
     , h.hgroup
     , l.lgroup
  FROM (SELECT b.name
             , LISTAGG(NVL(b.hgroup, 'X'||a.lv), ' ') WITHIN GROUP(ORDER BY a.lv) hgroup
          FROM (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 10) a
          LEFT OUTER JOIN (SELECT DISTINCT name, hgroup FROM data_t) b
          PARTITION BY (b.name)
            ON 'H'||a.lv = b.hgroup
         GROUP BY b.name
        ) h
     , (SELECT b.name
             , LISTAGG(NVL(b.lgroup||'', 'X'||a.lv), ' ') WITHIN GROUP(ORDER BY a.lv) lgroup
          FROM (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 12) a  -- :p_to
          LEFT OUTER JOIN data_t b
          PARTITION BY (b.name)
            ON a.lv = b.lgroup
         GROUP BY b.name
        ) l
 WHERE h.name = l.name
;

 

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