[英]Oracle 8i SQL - concatenate strings from different rows
我需要串聯來自不同行的字符串,如下所示。
每個NAME的行數是可變的,並且其范圍是未知的。
NAME COLOR
Bob Red
Bob Blue
Tom Green
John Red
John Yellow
John Purple
所需的輸出:
NAME COLORS
Bob RedBlue
Tom Green
John RedYellowPurple
我面臨的局限性是:
所以基本上:
我是SOL嗎?
Oracle 8i至少支持分析功能,因此您可以使用row_number()
或dense_rank()
每個顏色值分配一個標稱數字(按您認為有意義的順序):
select name, color,
row_number() over (partition by name order by color) as rn
from your_table;
然后在手動數據透視表上使用一個變體,每個可能的行號使用一個max(decode())
:
select name,
max(decode(rn, 1, color))
|| max(decode(rn, 2, color))
|| max(decode(rn, 3, color))
|| max(decode(rn, 4, color))
|| max(decode(rn, 5, color))
|| max(decode(rn, 6, color))
|| max(decode(rn, 7, color))
-- ...
as colors
from (
select name, color,
row_number() over (partition by name order by color) as rn
from your_table
)
group by name
order by name;
NAME COLORS
---------- ----------------------------------------------------------------------
Bob BlueRed
John PurpleRedYellow
Tom Green
您說的范圍是未知的,但是即使每個名稱的行數不受限制,但最終的字符串仍必須限制為最多4000個字符-根據您對實際顏色值的了解,您可以使用的最大數量。 (並且您可以一次性生成解碼部分)。
如果需要,可以用相同的方式包括定界符:
select name,
max(decode(rn, 1, color))
|| max(decode(rn, 2, ',')) || max(decode(rn, 2, color))
|| max(decode(rn, 3, ',')) || max(decode(rn, 3, color))
|| max(decode(rn, 4, ',')) || max(decode(rn, 4, color))
|| max(decode(rn, 5, ',')) || max(decode(rn, 5, color))
|| max(decode(rn, 6, ',')) || max(decode(rn, 6, color))
|| max(decode(rn, 7, ',')) || max(decode(rn, 7, color))
|| max(decode(rn, 8, ',')) || max(decode(rn, 8, color))
-- ...
as colors
from (
select name, color,
row_number() over (partition by name order by color) as rn
from your_table
where color is not null
)
group by name
order by name;
NAME COLORS
---------- ---------------------------------------------------------------------------------------
Bob Blue,Red
John Purple,Red,Yellow
Tom Green
我在內部查詢中包含了一個is not null
過濾器,以防萬一該列可為空-應該防止最終列表中的空元素。
(未在8i中進行測試,因為我找不到一個可以旋轉的舊實例,但是我不認為這會在以后使用任何引入的東西...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.