Sayangnya apa yang Anda coba lakukan tidak mungkin, setidaknya tidak dalam SQL "lurus" - Anda memerlukan SQL dinamis, atau proses dua langkah (pada langkah pertama menghasilkan string yang merupakan pernyataan SQL baru). Rumit.
Masalahnya adalah Anda tidak menyertakan daftar nama kota yang tetap (sebagai literal string). Anda mencoba membuat kolom berdasarkan apa pun yang Anda dapatkan (pilih kota dari karyawan). Dengan demikian jumlah kolom dan nama kolom tidak diketahui sampai mesin Oracle membaca data dari tabel, tetapi sebelum mesin mulai harus sudah tahu apa yang akan menjadi semua kolom. Kontradiksi.
Perhatikan juga bahwa jika ini mungkin, Anda hampir pasti menginginkannya (pilih berbeda kota dari karyawan).
TAMBAH:OP mengajukan pertanyaan lanjutan dalam komentar (lihat di bawah).
Pengaturan yang ideal adalah agar kota berada di meja mereka sendiri yang lebih kecil, dan "kota" di tabel karyawan memiliki batasan kunci asing sehingga hal "kota" dapat dikelola. Anda tidak ingin satu petugas HR memasuki New York, yang lain memasuki New York City dan yang ketiga memasuki NYC untuk kota yang sama. Dengan satu atau lain cara, pertama-tama coba kode Anda dengan mengganti subquery yang mengikuti operator IN di klausa pivot dengan daftar literal string yang dipisahkan koma untuk kota:... IN ('DFW', 'CH', 'NY'). Perhatikan bahwa urutan Anda memasukkannya ke dalam daftar ini akan menjadi urutan kolom dalam output. Saya tidak memeriksa seluruh kueri untuk melihat apakah ada masalah lain; coba ini dan beri tahu kami apa yang terjadi.
Semoga berhasil!