Первое решение:
SELECT id, rs_id
, MAX(CASE WHEN rn = 1 THEN rs_name END) AS rs_name1
, MAX(CASE WHEN rn = 2 THEN rs_name END) AS rs_name2
, MAX(CASE WHEN rn = 3 THEN rs_name END) AS rs_name3
, MAX(CASE WHEN rn = 4 THEN rs_name END) AS rs_name4
FROM (
SELECT t1.id, t1.rs_id, t2.rs_name, ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.rs_name) AS rn
FROM table1 t1 INNER JOIN table2 t2
ON t1.rs_id = t2.rs_id
) GROUP BY id, rs_id;
Второе решение:
SELECT id, rs_id,
REGEXP_SUBSTR (rsname_list, '[^,]+', 1, 1) AS rs_name1,
REGEXP_SUBSTR (rsname_list, '[^,]+', 1, 2) AS rs_name2,
REGEXP_SUBSTR (rsname_list, '[^,]+', 1, 3) AS rs_name3,
REGEXP_SUBSTR (rsname_list, '[^,]+', 1, 4) AS rs_name4
FROM
(
SELECT a.id,
a.rs_id,
LISTAGG (
b.rs_name, ','
) WITHIN GROUP (
ORDER BY b.rs_name
) AS rsname_list
FROM test_table1 a
LEFT JOIN test_table2 b ON a.rs_id = b.rs_id
GROUP BY a.id,a.rs_id
ORDER BY a.rs_id
);
У вас есть максимальное число столбцов - это будет всегда быть 4? Или вы ищете динамическое решение? – sgeddes
Что вы пробовали? Где у вас проблемы? – Degustaf
Это всегда было 4. Я пытался сделать это с помощью функции listaggr – Tarun