我是oracle的新手。 我在表的同一行中有两个值。我需要将一个值转换为列标题,另一个值作为该列标题的列值。 下面给出的Suspend表中的值示例。
Suspend_Key Suspend_Value
Trade_ID 1234
Start_Date 12-12-2014
Trade_Version 5
我需要将上述动态值转置为如下所示。
Trade_ID Start_Date Trade_Version
1234 12-12-2014 5
暂停表中的项目未修复。 枢轴功能允许执行某些聚合操作以进行转置。 解码(在网络中检查)不允许动态指定列标题名称。 有没有办法实现这个目标?
答案 0 :(得分:1)
使用Conditional Aggregate
SELECT Max(CASE WHEN Suspend_Key = 'Trade_ID' THEN Suspend_Value END) 'Trade_ID',
Max(CASE WHEN Suspend_Key = 'Start_Date' THEN Suspend_Value END) 'Start_Date',
Max(CASE WHEN Suspend_Key = 'Trade_Version' THEN Suspend_Value END) 'Trade_Version'
FROM Yourtable
或使用Pivot
select * from
(SELECT *
FROM Yourtable ) a
PIVOT (Max(Suspend_Value)
FOR (Suspend_Key) IN('Trade_ID','Start_Date','Trade_Version'))
答案 1 :(得分:0)
这是SQL无法做到的。使用SQL,您始终可以选择之前已知的列。
但是,数据库和SQL只是存储和检索数据的方法。您可以直接将它们用作程序员,但是对于用户来说,您可以编写检索并显示数据的程序(无论是Java,C#,PHP还是其他)。编写此程序,使其显示您希望它们显示的结果。
换句话说:它不是dbms'关心如何最美妙地显示数据的任务。
另一点:这是一个非常通用的数据结构,应该有一个很好的理由来使用它。在您的情况下:是否还有没有ID的交易条目?是否有开始日期,例如1914年12月的某个时间,'昨天',' 2000年10月1日或2日'?或者你想将它们存储为字符串的原因是什么?您是否会认识到' Trade_ID',' Trade_Id'和'贸易ID'是一样的?说到这一点,使用这样的结构可以防止dbms提供数据类型完整性和数据一致性以及快速数据访问。
如果由于某种严重的原因你需要这样一个多功能的结构,那么NoSQL DBMS可能会更合适。
答案 2 :(得分:0)
Oracle中有一个用于动态旋转的选项。 PIVOT XML。获得XML后,您可以使用XMLTABLE函数将其转换为关系表。
答案 3 :(得分:-1)
你可以使用PIVOT和一些聚合功能,或使用一些报告工具,没有其他方法可以达到你想要的结果。
答案 4 :(得分:-1)
with a as (
select 'Trade_ID' as Suspend_Key , '1234' as Suspend_Value from dual
union
select 'Start_Date' as Suspend_Key , '12-12-2014' as Suspend_Value from dual
union
select 'Trade_Version' as Suspend_Key , '5' as Suspend_Value from dual
)
select max(case when Suspend_key='Trade_ID' then Suspend_value else null end) as Trade_ID ,
max(case when Suspend_key='Start_Date' then Suspend_value else null end) as Start_Date ,
max(case when Suspend_key='Trade_Version' then Suspend_value else null end) as Trade_Version
from a;