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

Oracle strengaggregering

Jeg vil antage, at PRIORITY kolonnen er altid 1, når der er et "hovedprodukt" og aldrig 1 på andre tidspunkter. Ud fra dine data ser det også ud til, at hver kunde kun har ét "hoved" produkt. Jeg vil antage, at dette er sandt. Hvis det ikke er det, skal du have en anden kolonne til at skelne mellem produktgrupper. Du kan blot tilføje dette til nedenstående.

Det komplicerede/effektive svar kan være som følger:

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

Pr. kunde, PRODUCT kolonnen antager, at hver kunde har et hovedprodukt, og derefter får det første produkt i rækkefølge efter prioritet. Den anden kolonne tager kun hvor prioriteten er 2 og bruger strengsammenkædningsfunktionen LISTAGG() til at sammenkæde dine værdier.

Jeg vil varmt anbefale Rob van Wijks blogindlæg om KEEP-klausulen.

En mere standard SQL-løsning ville se sådan ud:

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

dvs. find alt, der har en prioritet på 1, brug dette til at generere dine to rækker og få derefter alt med en prioritet på 2 og aggregér dem.



  1. Forpligtelse af transaktioner, mens en postgreql-funktion udføres

  2. Hvordan gemmer man filnavnet i databasen med anden info, mens man uploader billedet til serveren ved hjælp af PHP?

  3. Oprettelse af nye moduler ved hjælp af PostgreSQL Create Extension

  4. Sådan indstilles lokaliteten for den aktuelle forbindelse i MySQL