2016-08-03 3 views
0

나는 다음과 같다 오라클 11g 데이터베이스에서 테이블을 가지고 :오라클 그룹 및 피벗

ownerid | propertyid | name 
-------------------------------------- 
1  | 1000001 | SMITH MARY 
2  | 1000001 | SMITH JOHN 
3  | 1000002 | HUGHES JANE 
4  | 1000003 | CHEN ALICE 
5  | 1000003 | MCCOY ELLIS 

이처럼 보이도록 내가 컬럼에 행을 그룹에 propertyid에 테이블을 시도하고 피벗있어 이 :

propertyid | owner1   | owner2 
--------------------------------------------- 
10001  | SMITH MARY  | SMITH JOHN 
10002  | HUGHES JANE | <null> 
10003  | CHEN ALICE  | MCCOY ELLIS 

각 속성은 1 ~ 3 소유자를 가질 수 있습니다,하지만 난 ownerid 주문할 때 나타나는 바와 같이, 제 1 두에만 관심이 있어요.

가장 좋은 해결책은 "첫 번째"소유자와 "두 번째"소유자 중 하나 인 두 개의 하위 쿼리를 만드는 것입니다. 다음과 같이 나는 nth_value 기능을 사용 :

-- first owners 
select 
    propertyid, 
    nth_value(name, 1) over (partition by propertyid order by ownerid) as owner_1 
from owners 

을하지만이 날 중복 특성과 소유자의 (정확하지만) 쌍 소유자의 총 수는 더 나은이 있어야합니다 같은 느낌 일반적으로 1보다 큰 경우 제공 이것을하는 방법. 누구든지 아이디어가 있습니까?

답변

2
with 
    inputs (ownerid, propertyid, name) as (
     select 1, 1000001, 'SMITH MARY' from dual union all 
     select 2, 1000001, 'SMITH JOHN' from dual union all 
     select 3, 1000002, 'HUGHES JANE' from dual union all 
     select 4, 1000003, 'CHEN ALICE' from dual union all 
     select 5, 1000003, 'MCCOY ELLIS' from dual 
    ), 
    prep (propertyid, name, rn) as (
     select propertyid, name, 
       row_number() over (partition by propertyid order by ownerid) 
     from inputs 
    ) 
select * 
from prep 
pivot (max(name) for rn in (1 as owner1, 2 as owner2)) 
order by propertyid 
; 


PROPERTYID OWNER1  OWNER2 
---------- ----------- ----------- 
    1000001 SMITH MARY SMITH JOHN 
    1000002 HUGHES JANE 
    1000003 CHEN ALICE MCCOY ELLIS 

3 rows selected. 
+0

위 예제는 훌륭하게 작동했으며,'inputs' =>'prep' => 작업 패턴을 좋아합니다. 나는 그들이 실제로 오라클 함수라고 생각하면서 잠시 동안 인터넷 검색을하고 있음을 인정해야하지만 :) 감사합니다! – Rob

+1

lol 나는 올바른 답을 찾길 바래 (WITH 절, CTE, 하위 쿼리를 고려함 ...) 나는 일찍이 그것을 배웠고 지금은 항상 사용하므로 쿼리를 더 쉽게 읽고 따르게한다. 기쁜 데 도움이되었습니다. 건배! – mathguy