Saya menggunakan perintah berikut.

select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from table
group by col1, col2

Keluaran:

col1      col2      col3

KOCHI   ERNAKULAM   residential, commercial, residential, residential

Tetapi saya membutuhkan output berikut sebagai

col3 :

residential, commercial.

Saya mencoba menggunakan DISTINCT di subquery tetapi tidak mendapatkan hasil yang diperlukan. Ada bantuan?

0
Jack 15 Januari 2021, 12:31

3 jawaban

Jawaban Terbaik

Anda dapat menggunakan distinct di sub-kueri sebagai berikut:

select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from (select distinct col1, col2, colname from table)
group by col1, col2
0
Popeye 15 Januari 2021, 09:44

Pertama pilih nilai yang berbeda, lalu terapkan XMLAGG, mis.

select col1, col2, XMLAGG(XMLELEMENT(E, colname || ',')).EXTRACT('//text()')
from (select distinct col1, col2, colname
      from table 
     )
group by col1, col2

Padahal, jika string yang dihasilkan tidak melebihi 4000 karakter, pertimbangkan untuk menggunakan LISTAGG:

select col1, col2, LISTAGG(colname, ',')) within group (order by null)
from (select distinct col1, col2, colname
      from table 
     )
group by col1, col2
0
Littlefoot 15 Januari 2021, 09:45

Meskipun subquery dengan DISTINCT berfungsi dalam kasus ini, ini bukan solusi yang dapat digeneralisasikan. Itu bisa mengganggu kolom lain yang mungkin ingin Anda sertakan dalam kueri.

XMLAGG() mengabaikan nilai NULL. Jadi pendekatan yang lebih umum menggunakan ROW_NUMBER():

select col1, col2,
       XMLAGG(CASE WHEN SEQNUM. = 1 THEN XMLELEMENT(E, colname || ',') END).EXTRACT('//text()')
from (select t.*,
             ROW_NUMBER() OVER (PARTITION BY col1, col2, colname ORDER BY colname) as seqnum
      from t
     ) t
group by col1, col2
0
Gordon Linoff 15 Januari 2021, 12:05