Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Agregacja ciągów Oracle

Zakładam, że PRIORITY kolumna to zawsze 1, gdy istnieje „główny produkt”, i nigdy 1 w innym czasie. Z Twoich danych wynika również, że każdy klient ma tylko jeden „główny” produkt. Zakładam, że to prawda. Jeśli tak nie jest, powinieneś mieć kolejną kolumnę, aby rozróżnić grupy produktów. Możesz po prostu dodać to poniżej.

Skomplikowana/efektywna odpowiedź może być następująca:

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

Skrzypce SQL

Na klienta PRODUCT kolumna zakłada, że ​​każdy klient ma produkt główny, a następnie otrzymuje pierwszy produkt w kolejności według priorytetu. Druga kolumna przyjmuje tylko tam, gdzie priorytet wynosi 2 i używa funkcji konkatenacji ciągów LITAGG() do łączenia wartości.

Gorąco polecam wpis na blogu Roba van Wijka o klauzuli KEEP.

Bardziej standardowe rozwiązanie SQL wyglądałoby tak:

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

tj. znajdź wszystko, co ma priorytet 1, użyj tego do wygenerowania dwóch wierszy, a następnie uzyskaj wszystko z priorytetem 2 i zagreguj je.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj interwał na minuty

  2. Zdanie BETWEEN kontra <=AND>=

  3. Oracle ORA-12154:TNS:Nie można rozpoznać błędu nazwy usługi?

  4. Jak sklonować użytkownika w Oracle

  5. Jak przyznać dostęp do widoków v$ (v$sesja ,v$instance)