Oracle
 sql >> база данни >  >> RDS >> Oracle

Агрегация на низове на Oracle

Предполагам, че PRIORITY колоната винаги е 1, когато има "основен продукт" и никога 1 друг път. От вашите данни също изглежда, че всеки клиент има само един „основен“ продукт. Предполагам, че това е вярно. Ако не е, тогава трябва да имате друга колона, за да разграничите продуктовите групи. Можете просто да добавите това към по-долу.

Сложният/ефикасен отговор може да бъде следният:

select customer
     , max(product) keep (dense_rank first order by priority) as main_product
     , listagg(case when priority = 2 then product end, ', ')
         within group (order by product) as sub_product
  from products
 group by customer

SQL Fiddle

На клиент, PRODUCT колоната предполага, че всеки клиент има основен продукт, след което получава първия продукт подреден по приоритет. Втората колона приема само когато приоритетът е 2 и използва функцията за конкатенация на низове LISTAGG(), за да обедини вашите стойности заедно.

Горещо препоръчвам публикацията в блога на Роб ван Вийк относно клаузата KEEP.

По-стандартно SQL решение би изглеждало така:

select a.customer, a.product as main_product
     , listagg(b.product, ', ') within group (order by b.product) as sub_product
  from products a
  join products b
    on a.customer = b.customer
 where a.priority = 1
   and b.priority = 2
 group by a.customer, a.product

т.е. намерете всичко, което има приоритет 1, използвайте това, за да генерирате вашите два реда и след това вземете всичко с приоритет 2 и ги агрегирайте.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Web Site Down и Twitter Feed

  2. Oracle.ManagedDataAccess.EntityFramework - ORA-01918:потребител 'dbo' не съществува

  3. Обработка на ExecuteScalar(), когато не се връщат резултати

  4. Как да продължите обработката на курсора след изключение в Oracle

  5. Oracle Изтриване на редове, съвпадение на множество стойности