Сводные результаты в Oracle - PullRequest
       5

Сводные результаты в Oracle

0 голосов
/ 20 сентября 2018

У меня есть четыре таблицы (Oracle):

party
----------------
key

person
----------------
party_key | name

organization
----------------
party_key | name

id
----------------
party_key | id (varchar)

В таблице 'id' есть несколько (более 1) идентификаторов на организацию и по одному на человека (не мой дизайн модели бизнеса / данных)- без контроля над этим)вот так:

person_name |   org_name | person_id | org_id1 | org_id2
       John | whitehouse |     00005 |    0001 |    0002
   Samantha | whitehouse |     00007 |    0001 |    0002
       John |    library |     00005 |    0008 |    0009
   Samantha |    library |     00007 |    0008 |    0009

Я думаю, что решение включает pivot, но я не уверен, как его выполнить.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я не уверен, что ваша структура таблицы и всегда объединение на party_key работает ... но вот как использовать PIVOT (сначала вы должны присвоить каждой организации идентификатор строки с помощью аналитики ROW_NUMBERфункция):

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE party ( key ) AS
  SELECT 1 FROM DUAL;

CREATE TABLE person (party_key, name ) AS
  SELECT 1, 'John'     FROM DUAL UNION ALL
  SELECT 1, 'Samantha' FROM DUAL;

CREATE TABLE organization ( party_key, name ) AS
  SELECT 1, 'Whitehouse' FROM DUAL UNION ALL
  SELECT 1, 'Library'    FROM DUAL;


CREATE TABLE id ( party_key, id ) AS
  SELECT 1, '0001' FROM DUAL UNION ALL
  SELECT 1, '0002' FROM DUAL;

Запрос 1 :

SELECT *
FROM   (
  SELECT pers.name as person_name,
         org.name as org_name,
         id_pers.id as person_id,
         id_org.id as org_id,
         ROW_NUMBER() OVER (
           PARTITION BY pers.name, org.name, id_pers.id
           ORDER BY id_org.id
         ) AS rn
  FROM   party part
         INNER JOIN person pers ON pers.party_key = part.key
         INNER JOIN organization org ON org.party_key = part.key
         INNER JOIN id id_pers ON pers.party_key = id_pers.party_key
         INNER JOIN id id_org ON pers.party_key = id_org.party_key
)
PIVOT ( MAX( org_id ) FOR rn IN (
  1 AS org_id1,
  2 AS org_id2
) )

Результаты :

| PERSON_NAME |   ORG_NAME | PERSON_ID | ORG_ID1 | ORG_ID2 |
|-------------|------------|-----------|---------|---------|
|        John |    Library |      0001 |    0001 |    0002 |
|        John |    Library |      0002 |    0001 |    0002 |
|        John | Whitehouse |      0001 |    0001 |    0002 |
|        John | Whitehouse |      0002 |    0001 |    0002 |
|    Samantha |    Library |      0001 |    0001 |    0002 |
|    Samantha |    Library |      0002 |    0001 |    0002 |
|    Samantha | Whitehouse |      0001 |    0001 |    0002 |
|    Samantha | Whitehouse |      0002 |    0001 |    0002 |
0 голосов
/ 20 сентября 2018

Используйте мин и макс вместе с группой по:

    select person_name, org_name,person_id, min(org_id), max(org_id)
    from 
   (SELECT pers.name as person_name, org.name as org_name, id_pers.id as person_id, id_org.id as org_id
FROM party part
INNER JOIN person pers ON pers.party_key = part.key
INNER JOIN organization org ON org.party_key = part.key
INNER JOIN id id_pers ON pers.party_key = id_pers.party_key
INNER JOIN id id_org ON pers.party_key = id_org.party_key)a
    group by person_name, org_name,person_id
...