sql >> Databáze >  >> RDS >> Oracle

Oracle agregace řetězců

Budu předpokládat, že PRIORITY sloupec je vždy 1, když existuje "hlavní produkt", a nikdy 1 jindy. Z vašich dat to také vypadá, že každý zákazník má pouze jeden „hlavní“ produkt. Budu předpokládat, že je to pravda. Pokud tomu tak není, měli byste mít další sloupec pro rozlišení skupin produktů. Můžete to jednoduše přidat níže.

Složitá/účinná odpověď může být následující:

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

Na zákazníka, PRODUCT předpokládá, že každý zákazník má hlavní produkt, pak dostane první produkt v pořadí podle priority. Druhý sloupec přebírá pouze priority 2 a používá funkci zřetězení řetězců LISTAGG() ke zřetězení vašich hodnot dohromady.

Velmi bych doporučil blogový příspěvek Roba van Wijka o klauzuli KEEP.

Standardnější řešení SQL by vypadalo takto:

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. najděte vše, co má prioritu 1, použijte toto ke generování svých dvou řádků a poté získejte vše s prioritou 2 a agregujte je.



  1. Zkontrolujte statistické cíle v PostgreSQL

  2. Použití výstupních parametrů uložené procedury v C#

  3. Použití DBCC CLONEDATABASE ke generování kopie schématu a statistik pouze uživatelské databáze v SQL Server 2014 SP2

  4. Mysql rekurze?