sql >> Database >  >> RDS >> Oracle

Aggregatie van Oracle-tekenreeksen

Ik ga ervan uit dat de PRIORITY kolom is altijd 1 als er een "hoofdproduct" is en nooit een andere keer. Uit uw gegevens blijkt ook dat elke klant slechts één "hoofd" product heeft. Ik ga ervan uit dat dit waar is. Als dit niet het geval is, zou u een andere kolom moeten hebben om productgroepen te onderscheiden. Je kunt dit eenvoudig hieronder toevoegen.

Het ingewikkelde/efficiënte antwoord kan als volgt zijn:

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

Per klant, het PRODUCT kolom gaat ervan uit dat elke klant een hoofdproduct heeft en krijgt vervolgens het eerste product op volgorde van prioriteit. De tweede kolom neemt alleen waar de prioriteit 2 is en gebruikt de tekenreeksaaneenschakelingsfunctie LISTAGG() om uw waarden samen te voegen.

Ik zou de blogpost van Rob van Wijk over de KEEP-clausule ten zeerste aanbevelen.

Een meer standaard SQL-oplossing ziet er als volgt uit:

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

d.w.z. vind alles dat een prioriteit van 1 heeft, gebruik dit om uw twee rijen te genereren en verkrijg dan alles met een prioriteit van 2 en aggregeer deze.



  1. Prestatiebewaking en -audit PostgreSQL - Topbronnen

  2. Hoe tel je het aantal keren dat een bepaalde substring in een SQL-varchar voorkomt?

  3. Hoe kan ik detecteren dat een query voor maken, bijwerken en verwijderen succesvol is in Codeigniter?

  4. Hoe praat Access met ODBC-gegevensbronnen? Deel 4