안녕하세요 쿼리 질문이 있어서 글등록 합니다.
A | B |
---|---|
1 | a |
1 | b |
2 | c |
2 | d |
2 | e |
2 | f |
3 | g |
3 | h |
3 | i |
3 | j |
3 | k |
3 | l |
테이블에 위와 같은 데이터가 있는데 이 데이터를 아래와 같은 결과로 표출해야 합니다.
ST_DT와 ED_DT는 A의 값이며, COUNT의 값은 중복 제거 된 B값 입니다.
A가 1보다 크거나 같고 1보다 작거나 같으면 COUNT값은 2가 되고,
A가 1보다 크거나 같고 2보다 작거나 같으면 COUNT값은 6이 되게끔 결과가 나와야 합니다.
A가 2보다 크거나 같고 2보다 작거나 같으면 COUNT값은 4가 되는거구요
혹시 방법 아시는분들은 댓글 달아주시면 감사하겠습니다.
ST_DT | ED_DT | COUNT |
---|---|---|
1 | 1 | 2 |
1 | 2 | 6 |
2 | 2 | 4 |
1 | 3 | 12 |
2 | 3 | 10 |
3 | 3 | 6 |
WITH t AS ( SELECT 1 a, 'a' b FROM dual UNION ALL SELECT 1, 'b' FROM dual UNION ALL SELECT 2, 'c' FROM dual UNION ALL SELECT 2, 'd' FROM dual UNION ALL SELECT 2, 'e' FROM dual UNION ALL SELECT 2, 'f' FROM dual UNION ALL SELECT 3, 'g' FROM dual UNION ALL SELECT 3, 'h' FROM dual UNION ALL SELECT 3, 'i' FROM dual UNION ALL SELECT 3, 'j' FROM dual UNION ALL SELECT 3, 'k' FROM dual UNION ALL SELECT 3, 'l' FROM dual ) SELECT CONNECT_BY_ROOT(a) st_dt , a ed_dt , LENGTH(REPLACE(SYS_CONNECT_BY_PATH(b, ','), ',')) cnt FROM (SELECT a , LISTAGG(b) WITHIN GROUP(ORDER BY b) b , ROW_NUMBER() OVER(ORDER BY a) rn FROM t GROUP BY a ) CONNECT BY PRIOR rn + 1 = rn ORDER BY ed_dt, st_dt ;