2016-08-03 83 views
0

我有一个表中,看起来像这样一个Oracle 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订货时感兴趣。

我最好的解决方案是创建两个子查询:“第一”所有者和另一个“第二”所有者之一。我用了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' =>工作模式。虽然我不得不承认,我一直在Google上搜索这些内容,认为它们是Oracle的真正功能:)谢谢! – Rob

+1

我希望你找到了正确的答案(WITH子句,CTE,子查询保理......)我很早就学会了它,现在一直都在使用它,它使查询更容易阅读/遵循。很高兴帮助。干杯! – mathguy