행을 열로 정렬
요구사항
테이블 구조
create table test2
(no1 int, no2 int)
데이터는
1 11
1 12
1 13
2 21
2 22
3 31
원하는 출력결과는
1 11 12 13
2 21 22
3 31
처리쿼리 설명
1. no1의 가장 작은 rownumber값을 가진 데이터 집합을 만들어낸다. 여기서 주의깊게 봐야하는것은 group by와 min()인데 이렇게 하면 group by로 파티션된 로우들에서 가장 작은 값들을 찾게된다. 즉... 여러개의 min값을 가지게 된다.
select min(r11) r1,no1
from
(
select row_number() over (order by no1) as r11, no1
from test2
) as a
group by a.no1
2. 가장 밑에 있는 group by절에 의해 파티션되고 결과는 그룹화 된것만 나오게 된다.
group by b.no1
select절에서 max()는 파티션된 사항중에서 r - r1 = 0인 항목중에서 가장큰 값을 가져오게 되는데, 그 값은 rownumber를 사용해서 밑에서 데이터 집합을 만들었기 때문에 항상 1개 일수 밖에 없다.
max(case r-r1 when 0 then b.no2 else 0 end),
밑에 max값을 가져오는것도 동일한 로직에 의해 가져온다.
max(case r-r1 when 1 then b.no2 else 0 end),
처리쿼리
SELECT
b.no1,
MAX(CASE r-r1 WHEN 0 THEN b.no2 ELSE 0 END),
MAX(CASE r-r1 WHEN 1 THEN b.no2 ELSE 0 END)
FROM
(
SELECT
row_number() OVER(ORDER BY no1) AS r,
no1,
no2
FROM test2
) b
JOIN
(
SELECT
MIN(r11) r1,
no1
FROM
(
SELECT
row_number() OVER(ORDER BY no1) AS r11,
no1
FROM test2
) AS a
GROUP BY a.no1
) a
ON b.no1 = a.no1
GROUP BY b.no1