sql >> Base de Datos >  >> RDS >> Oracle

Agregación de cadenas de Oracle

Voy a asumir que la PRIORITY la columna siempre es 1 cuando hay un "producto principal" y nunca 1 en ningún otro momento. Según sus datos, también parece que cada cliente tiene solo un producto "principal". Voy a asumir que esto es cierto. Si no es así, debería tener otra columna para distinguir los grupos de productos. Simplemente puede agregar esto a continuación.

La respuesta complicada/eficiente puede ser la siguiente:

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

Violín SQL

Por cliente, el PRODUCT columna asume que cada cliente tiene un producto principal, luego obtiene el primer producto en orden de prioridad. La segunda columna solo toma donde la prioridad es 2 y usa la función de concatenación de cadenas LISTAGG() para concatenar sus valores.

Recomiendo encarecidamente la publicación de blog de Rob van Wijk sobre la cláusula KEEP.

Una solución SQL más estándar se vería así:

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

es decir, encuentre todo lo que tenga una prioridad de 1, use esto para generar sus dos filas y luego obtenga todo lo que tenga una prioridad de 2 y agréguelos.