[MYSQL] 데이터의 컬럼값 차이만큼 Row로 생성.(지난번 질문 내용) 0 3 1,278

by kkang [MySQL] [2018.12.03 15:33:09]


안녕하세요. 지난번에 질문했던 했던 내용인데요.

DB가 10.3.10-MariaDB 에서 mysql  8.0.13 로 변경이 되었습니다.  그래서 다시 질문을 드리게 되었습니다.

지난번에 마농님이 가이드 해주신  seq_1_to_9 b  -- MariaDB 전용 seq -- 이걸로 작성을 하였는데 

-----------------마농님 가이드------------------------

WITH t AS
(
SELECT 1 order_id, '201102' start_yyyymm, '201301' end_yyyymm, 100 order_rate
UNION ALL SELECT 2, '201801', '201812',  80
UNION ALL SELECT 3, '201802', '202301',  70
)
SELECT a.order_id
     , b.seq AS order_row
     , SUBSTR(a.start_yyyymm, 1, 4) + b.seq - 1 order_yyyy
     , a.order_rate
  FROM t a
 INNER JOIN seq_1_to_9 b    -- MariaDB 전용 seq 생성 --
    ON b.seq <= SUBSTR(a.end_yyyymm, 1, 4) - SUBSTR(a.start_yyyymm, 1, 4) + 1
 WHERE a.order_id = 3

-------------------------------------------- 

질문을 다시 드리겠습니다.

예를 들면 order 라는 테이블의 데이터에

order_id  start_yyyymm   end_yyyymm   order_rate
1         201102         201301        100         
2         201801         201812         80
3         201802         202301         70

이렇게 있다고 한다면

-------------------------------------------

order_id 가 3인 데이터를 추출 한다면 Row가

order_row year  order_rate  
1         2018  70         
2   2019  70        
3   2020  70        
4   2021  70        
5   2022  70        
6   2023  70        
----------------------------------------------


-------------------------------------------

order_id 가 1인 데이터를 추출 한다면 Row가

order_row year  order_rate  
1   2011  100         
2   2012  100        
3   2013  100               
----------------------------------------------

이렇게 추출 하고 싶습니다.

 

by 소주쵝오 [2018.12.03 16:30:13]
WITH t AS
(
SELECT 1 order_id, '201102' start_yyyymm, '201301' end_yyyymm, 100 order_rate
UNION ALL SELECT 2, '201801', '201812',  80
UNION ALL SELECT 3, '201802', '202301',  70
)
SELECT a.order_id
     , b.seq AS order_row
     , SUBSTR(a.start_yyyymm, 1, 4) + b.seq - 1 order_yyyy
     , a.order_rate
  FROM t a
 INNER JOIN 
 (select @num := @num + 1 as seq
  from t s1
     , t s2
     , (select @num := 0) n
  limit 9
  ) b
 ON b.seq <= SUBSTR(a.end_yyyymm, 1, 4) - SUBSTR(a.start_yyyymm, 1, 4) + 1
 WHERE a.order_id = 1
 ;

 


by kkang [2018.12.04 13:13:53]

소주쵝오님 감사합니다.


by 마농 [2018.12.06 08:02:31]

숫자만 저장되어 있는 복제 용도의 테이블을 하나 만들어 놓고 사용하시면 됩니다.

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