안녕하세요
제가 원하는 결과가 나오지 않아 질문드립니다
ex) 데이터가
item | color | price |
A | red | 100 |
A | red | 150 |
B | blue | 200 |
이렇게 있으면 item별로 묶어서 원하는 행 갯수만큼 데이터를 채우고 남은 부분은 null이 됐으면 좋겠습니다
예시 갯수 : 3
원하는 결과 :
item | color | price |
A | red | 100 |
A | red | 150 |
A | null | null |
B | blue | 200 |
B | null | null |
B | null | null |
만약 그룹별 데이터가 3개를 넘어갈시에 3의배수만큼 빈칸이 채워졌으면 좋겠습니다
ex) 아이템 A의 데이터가 5개일경우 5개 조회 후 마지막 한줄은 null
item | color | price |
A | red | 100 |
A | red | 150 |
A | red | 300 |
A | red | 400 |
A | red | 500 |
A | null | null |
현재는
기존데이터쿼리
UNION ALL
null행넣어주는쿼리
이렇게 만들어놓았습니다
WHERE에 item 조건을 in으로 넣어주니까 제가 원하는 그룹별로는 공백행이 생기지 않더라구요
좋은 방법이 있을까요 ?
WITH t AS ( SELECT 'A' item, 'red' color, 100 price UNION ALL SELECT 'A', 'red' , 150 UNION ALL SELECT 'B', 'blue', 200 ) , copy_t AS ( SELECT 1 lv UNION ALL SELECT lv + 1 FROM copy_t WHERE lv <= 99 ) SELECT a.item , c.color , c.price FROM (SELECT item , CEILING(COUNT(*) / 3.) * 3 cnt FROM t WHERE item IN ('A', 'B') GROUP BY item ) a INNER JOIN copy_t b ON b.lv <= a.cnt LEFT OUTER JOIN (SELECT item, color, price , ROW_NUMBER() OVER(PARTITION BY item ORDER BY item) rn FROM t ) c ON a.item = c.item AND b.lv = c.rn ORDER BY a.item, b.lv ;
-- 원본 테이블 명을 data_table 로 정의 했습니다. with t_null as ( select 1 as num from dual union all select 2 as num from dual ) ,tmp as ( select item, 3 - mod(count(1),3) as num from data_table group by item ) select t.* from ( select * from data_table union all select t1.item, null, null from tmp t1 ,t_null t2 where t1.num >= t2.num ) t where item in ('A','B') order by item, color
흥미있는 내용이여서 저도 따로 쿼리를 작성해 봤습니다.
(해당 데이터 row에 null row 를 추가하는 형태 입니다)