web-dev-qa-db-ja.com

2列のLISTAGG関数

このようなテーブルが1つあります(レポート)

--------------------------------------------------
|  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     |
--------------------------------------------------

次の結果が欲しい

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

つまり、結果の表でわかるように、空のスペースを ''として保持する必要があります。これでLISTAGG関数の使用方法がわかりましたが、1列のみです。ただし、2つの列を同時に処理する方法を正確に理解することはできません。これが私のクエリです:

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

前もって感謝します :-)

21
Jaanna

集約内での連結の賢明な使用が必要なだけです。

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

つまり、departmentの連結をコンマとpositionで集約し、positionがNULLの場合はスペースで置き換えます。

33
Ben