2016-08-03 4 views
0

У меня есть таблица в базе данных Oracle 11g, которая выглядит следующим образом:группы Oracle по поворачивающейся

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

Это сработало отлично, и мне нравится шаблон работы 'input' =>' prep' =>. Хотя я должен признать, что я искал их в течение некоторого времени, думая, что они являются реальными функциями Oracle :) Спасибо! – Rob

+1

lol Надеюсь, вы нашли правильный ответ (предложение WITH, CTE, факторинг подзапроса ...) Я узнал об этом на ранней стадии и теперь использую его все время, это упрощает чтение и чтение запросов. Рад, что это помогло. Ура! – mathguy

Смежные вопросы