Rev*_*ous 0 oracle unpivot oracle11g
我有一个长查询产生一些值.标识符名称太长.我更喜欢将结果集放在名为"列名"和"列值"的2列中.
我希望以下查询的IE:
column name column value
forn_old_codice_fornitura ***
VOF_VOCE_FATTURABILE_COD ***
IEF_ASSOGGETTAMENTO_COD ***
Run Code Online (Sandbox Code Playgroud)
***是实际值.
我能怎么做?
SELECT
forn.forn_old_codice_fornitura,
Run Code Online (Sandbox Code Playgroud)
'列描述1',VOF.VOF_VOCE_FATTURABILE_COD,'列描述2',IEF_ASSOGGETTAMENTO_COD"Cod Assog Neta",'列描述3'[...]
由于您使用的是Oracle 11g,因此可以使用该UNPIVOT
功能.这将获取您的列并将其转换为行:
select col_name , col_value
from
(
SELECT
forn.forn_old_codice_fornitura,
VOF.VOF_VOCE_FATTURABILE_COD,
IEF_ASSOGGETTAMENTO_COD,
ETA.ETA_CODICE_ASSOG,
CLU.CLU_CLASSE_FORNITURA_COD,
MVI.CLU_CLASSE_FORNITURA_COD,
ETA.ETA_USO_CLASSE_FORN,
MVI.MVI_FLG_SOGGETTO,
ETA.ETA_FLG_SOGGETTO,
[...]
)
unpivot
(
col_value
for col_name in (forn_old_codice_fornitura, VOF_VOCE_FATTURABILE_COD,
IEF_ASSOGGETTAMENTO_COD, ETA_CODICE_ASSOG, ...)
)
Run Code Online (Sandbox Code Playgroud)
根据您要使用列的长名称生成列描述的注释进行编辑,有两种方法可以执行此操作.
一,您可以使用一个CASE
表达式来替换col_name
您想要的列描述,类似于:
select col_name,
col_value,
case col_name
when 'col1' then 'Test Col 1'
when 'col2' then 'Test Col 2'
when 'col3' then 'Test Col 3'
when 'col4' then 'Test Col 4'
end col_desc
from yourtable
unpivot
(
col_value
for col_name in (col1, col2, col3, col4)
) unp;
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建一个包含转换col_name
到列描述的表,并将表连接到unpivot结果:
select d.col_name,
d.col_value,
cd.col_desc
from
(
select col_name,
col_value
from yourtable
unpivot
(
col_value
for col_name in (col1, col2, col3, col4)
) unp
) d
inner join cd
on d.col_name = cd.col_name
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo of both