Oracle 11 SQL:将1行拆分为x行并插入新列

问题描述 投票:0回答:2

我问过Oracle 11 SQL : Is there a way to split 1 row into x rows-这个问题非常接近,但有一点曲折...

客户要求将Oracle DB SQL中的1行分成6行。

例如,最初的SQL(具有多个join的复杂sql等)提取了9列:从X,Y,Z中选择A,B,C,D,E,F,G,H,I。 。 。 (但查询非常复杂)

1)A,B,C,D,E,F,G,H,I。

现在,客户要求返回返回到上述模式的每一行,新的输出应如下所示:1)A,B,C,“ D的名称:”,D2)A,B,C,“ E的名称:”,E3)A,B,C,“ F的名称:”,F4)A,B,C,“ G的名称:”,G5)A,B,C,“ H的名称:”,H6)A,B,C,“ I的名称:”,I

基本上,第1 3列的值将在所有6个新行中重复。新行的第4列将是一个字符串,其中说明了第5列的含义。

此过程将对原始查询中的每一行重复。

从先前的答案中,我知道unpivot可以做到这一点-只是无法自己解决这个问题。

sql oracle unpivot
2个回答
2
投票

您可以使用unpivot子句。我认为这段代码将为您提供帮助:

select a,b,c,'Name for ' || name_code || ' : '|| name_code as value  from 
(select 'A' a ,'B' b ,'C' c ,'D' d,'E' e,'F' f,'G' g,'H' h,'I' i from dual) 
unpivot include nulls 
(
name_for for name_code in (d as 'D', e as 'E' ,f as 'F',g as 'G',h  as 'H',i as 'I') 
);

导出将是这样:

enter image description here


1
投票

您可以将unpivotconcat()函数concat( concat('Name for ',val),' : ')或串联运算符(||)用作'Name for '||val||' : '一起使用:

with t(a,b,c,d,e,f,g,h,i) as
(
 select 1,2,3,'D','E',2,3,'X','Y' from dual 
)
select a,b,c, 
       concat( concat('Name for ',val),' : ') as explanation,
       val 
from
(
select a,b,c,to_char(d) as d, to_char(e) as e, to_char(f) as f, 
       to_char(g) as g, to_char(h) as h,to_char(i) as i
  from t
)  
unpivot 
( val for col in (d,e,f,g,h,i) )
order by col

Demo

© www.soinside.com 2019 - 2024. All rights reserved.