преобразовать несколько строк в один ряд - PullRequest
0 голосов
/ 04 мая 2020

У меня есть эта таблица:

id  operation  phone_number  package
1   Add        991           super_package no. 2    
1   Delete     991           super_package no. 1
2   Add        902           super_package no. 3    
2   Delete     902           super_package no. 1
2   Add        988           super_package no. 5    
2   Delete     988           super_package no. 2

Я хочу запросить таблицу, чтобы она выглядела следующим образом:

id  phone_number  new_pkg              old_pkg
1   991           super_package no. 2  super_package no. 1
2   902           super_package no. 3  super_package no. 1
3   988           super_package no. 5  super_package no. 2

для значения new_pkg устанавливается значение столбца пакета, если Операция add, а для значения old_pkg устанавливается значение столбца пакета, если для операции выбрано Delete.

все, что я мог сделать, это:

SELECT id,phone_number  , LISTAGG(package, ', ') WITHIN GROUP (ORDER BY id) AS new_pkg
FROM table GROUP BY id;

результат

id phone_number  new_pkg  
1  991           super_package no. 2, super_package no. 1
2  902           super_package no. 3, super_package no. 1
3  988           super_package no. 5, super_package no. 2

любая помощь?

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Я думаю, вы хотите условное агрегирование:

SELECT id, phone_number,
       MAX(CASE WHEN operation = 'ADD' THEN package END) as new_pkg,
       MAX(CASE WHEN operation = 'DELETE' THEN package END) as old_pkg
FROM table
GROUP BY id, phone_number;
1 голос
/ 04 мая 2020

Необходимая операция называется pivoting . Oracle добавил для этого оператор pivot еще в версии 11.1.

with
  sample_data (id, operation, phone_number, package) as (
    select 1, 'Add'   , 991, 'super_package no. 2' from dual union all    
    select 1, 'Delete', 991, 'super_package no. 1' from dual union all
    select 2, 'Add'   , 902, 'super_package no. 3' from dual union all
    select 2, 'Delete', 902, 'super_package no. 1' from dual union all
    select 3, 'Add'   , 988, 'super_package no. 5' from dual union all
    select 3, 'Delete', 988, 'super_package no. 2' from dual
  )
-- End of sample data (for testing only, not part of the query).
-- Use your real table name in the FROM clause below.
select id, phone_number, new_pkg, old_pkg
from   sample_data
pivot  (min(package) for operation in ('Add' as new_pkg, 'Delete' as old_pkg))
order  by id  --  if needed
;

ID  PHONE_NUMBER  NEW_PKG              OLD_PKG            
--  ------------  -------------------  -------------------
 1           991  super_package no. 2  super_package no. 1
 2           902  super_package no. 3  super_package no. 1
 3           988  super_package no. 5  super_package no. 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...