[英]Transposing and aggregating Oracle column data
我有以下數據
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;
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.