이제 갓 조인을 조금씩 쓰고 있는 sql 초보입니다.
5개의 행을 열로 변경하면서 반복하는 방법이 있을까요???
다음과 같은 식으로 저장되어 있는 테이블에서...
A B C
----------------------------
aaa bbb ccc
ddd eee fff
ggg hhh iii
jjj kkk lll
mmm nnn ooo
ppp qqq rrr
sss ttt uuu
vvv www xxx
yyy zzz 가가
나나 다다 라라
... ... ...
... ... ...
... ... ...
... ... ...
... ... ...
행의 갯수는 언제나 5의 배수로 딱 떨어지는데,
5행씩 끊어서 15개의 열로 변경하고 싶습니다.
다음과 같은 결과가 되겠지요.
aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo
ppp qqq rrr sss ttt uuu vvv www xxx yyy zzz 가가 나나 다다 라라
... ... ... ... ... ... ... ... ... .... .... ... ... .... ...
... ... ... ... ... ... ... ... ... .... .... ... ... .... ...
일단 순서가 중요하기 때문에 순서가 있어야 합니다... 임의대로 만드시던가
어떠한 기준이 되는 기준값은 반드시 있어야 합니다...
수학적인 개념을 도입하면 이런 순차적이 규칙의 쿼리는 좀더 간략(?)하게 구현이 됩니다..
적절한 함수를 이용하시는게 쿼리가 편해집니다...
다른 방법으로는 case when 으로 그냥 붙이는 방법 .. 이 경우도 순서가 있어야 합니다...
with
res as (
select 1 seq , 'a01' a, 'b01' b ,'c01' c union all
select 2 seq , 'a02' a, 'b02' b ,'c02' c union all
select 3 seq , 'a03' a, 'b03' b ,'c03' c union all
select 4 seq , 'a04' a, 'b04' b ,'c04' c union all
select 5 seq , 'a05' a, 'b05' b ,'c05' c union all
select 6 seq , 'a06' a, 'b06' b ,'c06' c union all
select 7 seq , 'a07' a, 'b07' b ,'c07' c union all
select 8 seq , 'a08' a, 'b08' b ,'c08' c union all
select 9 seq , 'a09' a, 'b09' b ,'c09' c union all
select 10 seq , 'a10' a, 'b10' b ,'c10' c union all
select 11 seq , 'a11' a, 'b11' b ,'c11' c union all
select 12 seq , 'a12' a, 'b12' b ,'c12' c union all
select 13 seq , 'a13' a, 'b13' b ,'c13' c union all
select 14 seq , 'a14' a, 'b14' b ,'c14' c union all
select 15 seq , 'a15' a, 'b15' b ,'c15' c
) ,
prcess1 as ( -- 단계UNPIVOT을이용열값을행값으로
select *
from res
UNPIVOT(
val FOR gb IN (a, b, c )
) AS unpvt
) ,
prcess2 as ( -- 단계수학적개념을이용하면쉬어진다. 등차수열
select val
, seq
, (3 * seq) - 2 suyel -- 등차수열
, case gb when 'a' then 0 when 'b' then 1 when 'c' then 2 end cseq
, ((3 * seq) - 2 ) + (case gb when 'a' then 0 when 'b' then 1 when 'c' then 2 end) new_seq
from prcess1
),
prcess3 as ( -- 단계새롭게적용할위치값을지정한다...
select val
, new_seq
, CEILING(new_seq / 15. ) g_row
, new_seq - ( (CEILING(new_seq / 15.) - 1 )* 15) g_col
from prcess2
)
-- 행값을열값으로전환한다...
select g_row
, max([1]) [1] , max([2]) [2] , max([3]) [3]
, max([4]) [4] , max([5]) [5] , max([6]) [6]
, max([7]) [7] , max([8]) [8] , max([9]) [9]
, max([10]) [10], max([11]) [11], max([12]) [12]
, max([13]) [13], max([14]) [14], max([15]) [15]
from prcess3
PIVOT
(
max (val)
FOR g_col IN
( [1], [2], [3], [4], [5] , [6], [7], [8], [9], [10], [11], [12], [13], [14], [15])
) AS pvt
group by g_row