mssql 빈 row 만들기 질문 드립니다 0 8 3,395

by 미노 [SQL Query] mssql [2022.05.30 17:32:10]


안녕하세요

제가 원하는 결과가 나오지 않아 질문드립니다

 

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으로 넣어주니까 제가 원하는 그룹별로는 공백행이 생기지 않더라구요

좋은 방법이 있을까요 ?

by 마농 [2022.05.30 17:56:26]

그룹핑 기준이 뭔가요?
1. item
2. item, color


by 미노 [2022.05.31 09:08:09]

item 기준입니다!


by 마농 [2022.05.31 09:11:39]
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
;

 


by 미노 [2022.05.31 09:55:09]

정말정말 감사합니다 써주신 정답 참고해서 바로 해결했습니다 

좋은 하루 되세요


by 우주민 [2022.05.31 10:02:11]
-- 원본 테이블 명을 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 를 추가하는 형태 입니다)


by 마농 [2022.05.31 10:35:50]

Oracle 에서 하셨네요.
로직 보완이 필요합니다.
나머지가 없는 경우에 잘못된 결과가 나오게 됩니다.


by 우주민 [2022.05.31 10:42:03]

아.. 나머지 없는 경우는 생각하지 못했습니다.

ms 환경이 안되어서 mysql로 테스트 했는데, 역시 문제가 있었네요.


by 마농 [2022.05.31 10:52:02]

MySQL 에 dual 테이블을 만들어 두셨나요?
MySQL 에서는 Oracle 과 달리 FROM dual 안쓰셔도 SELECT 됩니다.

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