このようなテーブルが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
前もって感謝します :-)
集約内での連結の賢明な使用が必要なだけです。
select user_id
, listagg(department || ',' || coalesce(position, ' '), '; ')
within group ( order by record_id )
from report
group by user_id
つまり、department
の連結をコンマとposition
で集約し、position
がNULLの場合はスペースで置き換えます。