web-dev-qa-db-fra.com

Fonction LISTAGG avec deux colonnes

J'ai une table comme celle-ci (rapport)

--------------------------------------------------
|  user_id |  Department | Position  | Record_id |
--------------------------------------------------
|  1       |  Science    | Professor |  1001     |
|  1       |  Maths      |           |  1002     |
|  1       |  History    | Teacher   |  1003     |
|  2       |  Science    | Professor |  1004     |
|  2       |  Chemistry  | Assistant |  1005     |
--------------------------------------------------

J'aimerais avoir le résultat suivant

   ---------------------------------------------------------
   | user_id  |  Department+Position                       |
   ---------------------------------------------------------
   |  1       | Science,Professor;Maths, ; History,Teacher |
   |  2       | Science, Professor; Chemistry, Assistant   |
   ---------------------------------------------------------

Cela signifie que je dois conserver l'espace vide comme '' comme vous pouvez le voir dans le tableau des résultats. Maintenant, je sais comment utiliser la fonction LISTAGG mais seulement pour une colonne. Cependant, je ne peux pas comprendre exactement comment faire pour deux colonnes en même temps. Voici ma requête:

SELECT user_id, LISTAGG(department, ';') WITHIN GROUP (ORDER BY record_id)
FROM report

Merci d'avance :-)

21
Jaanna

Cela nécessite simplement une utilisation judicieuse de la concaténation au sein de l'agrégation:

select user_id
     , listagg(department || ',' || coalesce(position, ' '), '; ')
        within group ( order by record_id )
  from report
 group by user_id

c'est-à-dire agréger la concatentation de department avec une virgule et position et remplacer position par un espace s'il est NULL.

33
Ben