Oracle
 sql >> Database >  >> RDS >> Oracle

Aggregazione di stringhe Oracle

Presumo che la PRIORITY la colonna è sempre 1 quando c'è un "prodotto principale" e mai 1 in qualsiasi altro momento. Dai tuoi dati sembra anche che ogni cliente abbia un solo prodotto "principale". Presumo che questo sia vero. In caso contrario, dovresti avere un'altra colonna per distinguere i gruppi di prodotti. Puoi semplicemente aggiungerlo in basso.

La risposta complicata/efficiente potrebbe essere la seguente:

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 Violino

Per cliente, il PRODUCT colonna presuppone che ogni cliente abbia un prodotto principale, quindi ottiene il primo prodotto in ordine di priorità. La seconda colonna prende solo dove la priorità è 2 e usa la funzione di concatenazione di stringhe LISTAGG() per concatenare i tuoi valori insieme.

Consiglio vivamente il post sul blog di Rob van Wijk sulla clausola KEEP.

Una soluzione SQL più standard sarebbe simile a questa:

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

cioè trova tutto ciò che ha priorità 1, usa questo per generare le tue due righe e quindi ottieni tutto con priorità 2 e aggrega quelle.