转置和聚合Oracle列数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转置和聚合Oracle列数据相关的知识,希望对你有一定的参考价值。
我有以下数据
Base End
RMSA Item 1
RMSA Item 2
RMSA Item 3
RMSB Item 1
RMSB Item 2
RMSC Item 4
我想将其转换为以下格式
Key Products
RMSA;RMSB Item 1, Item 2
RMSA Item 3
RMSC Item 4
基本上,具有类似结果的那些应该分为1行。但是,我似乎无法使用listagg等工作,因为我正在分组两列。
有没有办法用直接的Oracle查询来做到这一点?
答案
您可以使用listagg()
窗口分析函数两次
with t1( Base, End ) as
(
select 'RMSA','Item 1' from dual union all
select 'RMSA','Item 2' from dual union all
select 'RMSA','Item 3' from dual union all
select 'RMSB','Item 1' from dual union all
select 'RMSB','Item 2' from dual union all
select 'RMSC','Item 4' from dual
),
t2 as
(
select
listagg(base,';') within group (order by end)
as key,
end
from t1
group by end
)
select key,
listagg(end,',') within group (order by end)
as Products
from t2
group by key
order by products;
Key Products
--------- --------------
RMSA;RMSB Item 1, Item 2
RMSA Item 3
RMSC Item 4
另一答案
以下是一种方式 -
WITH base
AS (SELECT 'RMSA' AS base,
'Item 1' AS end1
FROM dual
UNION
SELECT 'RMSA' AS base,
'Item 2' AS end1
FROM dual
UNION
SELECT 'RMSA' AS base,
'Item 3' AS end1
FROM dual
UNION
SELECT 'RMSB' AS base,
'Item 1' AS end1
FROM dual
UNION
SELECT 'RMSB' AS base,
'Item 2' AS end1
FROM dual
UNION
SELECT 'RMSC' AS base,
'Item 4' AS end1
FROM dual),
t11
AS (SELECT t1.base base1,
t1.end1 AS end11,
t2.base base2,
t2.end1 AS end12
FROM base t1
inner join base t2
ON t1.end1 = t2.end1
WHERE t1.base > t2.base) SELECT
Concat(Concat(t11.base1, ';'), t11.base1),
Listagg(t11.end11, ',')
within GROUP (ORDER BY t11.end11)
FROM t11
GROUP BY Concat(Concat(t11.base1, ';'), t11.base1)
--above query will get you results where you have similar results
UNION
SELECT t1.base,
t1.end1
FROM base t1
left outer join t11
ON t1.base = t11.base1
AND t1.end1 = t11.end11
left outer join t11 t12
ON t1.base = t12.base2
AND t1.end1 = t12.end11
WHERE t11.base1 IS NULL
AND t12.base2 IS NULL;
希望这可以帮助
以上是关于转置和聚合Oracle列数据的主要内容,如果未能解决你的问题,请参考以下文章