我注意到有关如何“取消listagg”的问题,但到目前为止,我找不到下面满足我要求的东西。 抱歉,如果我错过了过去的一些好答案。
我有如下数据:
------------------------------------------------------------
| Title | column_A | column_B | column_c |
--------------------------------------------------------------
| 3007576 | 1000 | 0 | 3000 |
| 3007879 | 100,200,300 | | 400,500 |
--------------------------------------------------------------
但我想在以下位置显示它们:
------------------------------------------------------------
| Title | column_A | column_B | column_c |
--------------------------------------------------------------
| 3007576 | 1000 | 0 | 3000 |
| 3007879 | 100 | | 400 |
| 3007879 | 100 | | 500 |
| 3007879 | 200 | | 400 |
| 3007879 | 200 | | 500 |
| 3007879 | 300 | | 400 |
| 3007879 | 300 | | 500 |
--------------------------------------------------------------
答案 0 :(得分:0)
您的数据存在问题,因为有三列,它们可以为空或长度可以变化。因此,您可以首先执行三个子查询(其中左联接很重要,不要丢失任何行),然后再执行左联接数据。要拆分我使用xmltable
方式的字符串,可以使用SO上已经描述的任何其他方法。
-- sample data
with t(title, column_A, column_B, column_c) as (
select 3007576, '1000', '0', '3000' from dual union all
select 3007879, '100, 200,300', null, '400,500' from dual union all
select 3007900, null, '80, 205, 212', '54, 5417' from dual )
-- end of sample data
select *
from (
select title, trim(column_value) ca from t
left join xmltable(('"' || replace(column_a, ',', '","') || '"')) on 1 = 1) a
left join (
select title, trim(column_value) cb from t
left join xmltable(('"' || replace(column_b, ',', '","') || '"')) on 1 = 1) b
using (title)
left join (
select title, trim(column_value) cc from t
left join xmltable(('"' || replace(column_c, ',', '","') || '"')) on 1 = 1) c
using (title)
order by title, ca, cb, cc
我的数据结果:
TITLE CA CB CC
-------- ----- ----- -----
3007576 1000 0 3000
3007879 100 400
3007879 100 500
3007879 200 400
3007879 200 500
3007879 300 400
3007879 300 500
3007900 205 54
3007900 205 5417
3007900 212 54
3007900 212 5417
3007900 80 54
3007900 80 5417