Oracle 10g:解析 2 列合并重复项
Oracle 10g: parsing 2 columns merging duplicates
我有一个包含 3 列的 table:
DATE_A
、DATE_B
和 ISSUE
DATE_A
和 DATE_B
可以通过 3 种可能的方式填写:
两者都有一个值,或者只有一个有值,如下所示:
DATE_A | DATE_B | ISSUE
----------+-----------+-----------
20130301 | 20140101 | bla
20150801 | null | foo
null | 20180701 | bar
我需要解析此 table 以填充新的 table,其中 DATE_A 和 DATE_B 均填充单个列 DATE_M
。
如果要插入到 DATE_M
中的 DATE_A
(或 DATE_B
)值已经存在于 DATE_M
中,则源 ISSUE
必须附加现有的 [=18] =] ISSUE
。下面的例子说明了原理。
例子
来源
DATE_A | DATE_B | ISSUE
----------+-----------+-----------
20130301 | 20140101 | bla1
20150801 | null | foo1
null | 20180701 | bar
20130301 | 20150101 | bla2
20150801 | null | foo2
目的地
DATE_M | ISSUE
----------+-----------
20130301 | bla1; bla2
20140101 | bla1
20150801 | foo1; foo2
20150101 | bla2
20180701 | bar
问题
是否可以编写一个查询来执行此操作,还是应该编写一个存储过程?如果单个查询可以,它会是什么?
如果我没理解错的话,您需要 union all
日期值和字符串聚合。 listagg()
是在 11g 中引入的,但您可以使用 wm_concat()
:
select dte, wm_concat(issue) as issues
from ((select date_a as dte, issue from t where date_a is not null) union all
(select date_b, issue from t where date_b is not null)
) di
group by dte
order by dte;
我有一个包含 3 列的 table:
DATE_A
、DATE_B
和 ISSUE
DATE_A
和 DATE_B
可以通过 3 种可能的方式填写:
两者都有一个值,或者只有一个有值,如下所示:
DATE_A | DATE_B | ISSUE
----------+-----------+-----------
20130301 | 20140101 | bla
20150801 | null | foo
null | 20180701 | bar
我需要解析此 table 以填充新的 table,其中 DATE_A 和 DATE_B 均填充单个列 DATE_M
。
如果要插入到 DATE_M
中的 DATE_A
(或 DATE_B
)值已经存在于 DATE_M
中,则源 ISSUE
必须附加现有的 [=18] =] ISSUE
。下面的例子说明了原理。
例子
来源
DATE_A | DATE_B | ISSUE
----------+-----------+-----------
20130301 | 20140101 | bla1
20150801 | null | foo1
null | 20180701 | bar
20130301 | 20150101 | bla2
20150801 | null | foo2
目的地
DATE_M | ISSUE
----------+-----------
20130301 | bla1; bla2
20140101 | bla1
20150801 | foo1; foo2
20150101 | bla2
20180701 | bar
问题
是否可以编写一个查询来执行此操作,还是应该编写一个存储过程?如果单个查询可以,它会是什么?
如果我没理解错的话,您需要 union all
日期值和字符串聚合。 listagg()
是在 11g 中引入的,但您可以使用 wm_concat()
:
select dte, wm_concat(issue) as issues
from ((select date_a as dte, issue from t where date_a is not null) union all
(select date_b, issue from t where date_b is not null)
) di
group by dte
order by dte;