sql >> Databasteknik >  >> RDS >> Oracle

Oracle-strängaggregation

Jag kommer att anta att PRIORITY kolumn är alltid 1 när det finns en "huvudprodukt" och aldrig 1 någon annan gång. Från din data ser det också ut som att varje kund bara har en "huvudprodukt". Jag kommer att anta att detta är sant. Om det inte är det bör du ha en annan kolumn för att särskilja produktgrupper. Du kan helt enkelt lägga till detta i nedan.

Det komplicerade/effektiva svaret kan vara följande:

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 kund, PRODUCT kolumnen antar att varje kund har en huvudprodukt och får sedan den första produkten i prioritetsordning. Den andra kolumnen tar bara där prioritet är 2 och använder strängsammansättningsfunktionen LISTAGG() för att sammanfoga dina värden.

Jag rekommenderar starkt Rob van Wijks blogginlägg om KEEP-klausulen.

En mer standard SQL-lösning skulle se ut så här:

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.v.s. hitta allt som har en prioritet på 1, använd detta för att generera dina två rader och hämta sedan allt med en prioritet på 2 och aggregera dessa.



  1. Hur BIT_LENGTH() fungerar i MariaDB

  2. cd:-M:ogiltigt alternativ

  3. PHP, MySQL-fel:Kolumnantal matchar inte värderäkning på rad 1

  4. Spåra databasändringar med hjälp av källkontroll för arbetsmapp