집계 피벗의 필요한 부분이지만, 여기에 적용 할 간단합니다; 당신이 원하지 않는 sum
하지만 max
집계 잘 작동합니다 :
select *
from (
select t.*,
row_number() over (partition by formid, formownerid
order by approverid) as rn
from t42 t
)
pivot (max(approverid) as approverid for (rn) in (1, 2, 3, 4));
FORMID FORMOWNERID 1_APPROVERID 2_APPROVERID 3_APPROVERID 4_APPROVERID
---------- ----------- ------------ ------------ ------------ ------------
1 100 102 103 104
2 200 103 105 107 109
3 400 201 210
또는 당신이 그 (것)들에게 유효한 식별자를 만들기 위해 명시 적으로 열 이름 접두사를 지정할 수 있습니다
pivot (max(approverid) as approverid
for (rn) in (1 as a, 2 as b, 3 as c, 4 as d));
는 내부 쿼리가 의사 열 rn
을 추가 실제 승인자 ID는 미리 알 수 없으므로 표 결과에 고정하여 피벗 할 값을 제공합니다.
수동 접근 방식은 조금 더 명확이 할 수 있습니다
select formid, formownerid,
max(case when rn = 1 then approverid end) as approverid_1,
max(case when rn = 2 then approverid end) as approverid_2,
max(case when rn = 3 then approverid end) as approverid_3,
max(case when rn = 4 then approverid end) as approverid_4
from (
select t.*,
row_number() over (partition by formid, formownerid
order by approverid) as rn
from t42 t
)
group by formid, formownerid
order by formid, formownerid;
FORMID FORMOWNERID APPROVERID_1 APPROVERID_2 APPROVERID_3 APPROVERID_4
---------- ----------- ------------ ------------ ------------ ------------
1 100 102 103 104
2 200 103 105 107 109
3 400 201 210
내부 쿼리가 동일합니다. case
문은 위의 각 열을 생산,하지만 당신은 여분의 공백이 많은 여러 행을 얻을 max
없이 그룹화 :
select formid, formownerid,
case when rn = 1 then approverid end as approverid_1,
case when rn = 2 then approverid end as approverid_2,
case when rn = 3 then approverid end as approverid_3,
case when rn = 4 then approverid end as approverid_4
from (
select t.*,
row_number() over (partition by formid, formownerid
order by approverid) as rn
from t42 t
);
FORMID FORMOWNERID APPROVERID_1 APPROVERID_2 APPROVERID_3 APPROVERID_4
---------- ----------- ------------ ------------ ------------ ------------
1 100 102
1 100 103
1 100 104
2 200 103
2 200 105
2 200 107
2 200 109
3 400 201
3 400 210
공지 사항 (대부분에서) 각 formid
/formownerid
하나의 열을 만 값이 있다고 조합이지만 다른 행에 나타납니다. max
은 여러 행을 표시하지 않습니다. 피벗 버전은 후드 아래에서 비슷한 기능을 수행합니다.
SQL Fiddle 중간 단계와 수동 방식을 보여주는 피봇 버전.
상태가 긴급했기 때문에 func을 코딩하고 반복했습니다. 모든 답변을 주셔서 감사합니다 – Doruk