안녕하세요
제가 원하는 결과가 나오지 않아 질문드립니다
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으로 넣어주니까 제가 원하는 그룹별로는 공백행이 생기지 않더라구요
좋은 방법이 있을까요 ?
그룹핑 기준이 뭔가요?
1. item
2. item, color
item 기준입니다!
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 를 추가하는 형태 입니다)
MySQL 에 dual 테이블을 만들어 두셨나요?
MySQL 에서는 Oracle 과 달리 FROM dual 안쓰셔도 SELECT 됩니다.
Oracle 에서 하셨네요.
로직 보완이 필요합니다.
나머지가 없는 경우에 잘못된 결과가 나오게 됩니다.
아.. 나머지 없는 경우는 생각하지 못했습니다.
ms 환경이 안되어서 mysql로 테스트 했는데, 역시 문제가 있었네요.