在oracle中将行转置为列标题

时间:2015-01-12 06:56:52

标签: sql oracle oracle11g pivot transpose

我是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

暂停表中的项目未修复。 枢轴功能允许执行某些聚合操作以进行转置。 解码(在网络中检查)不允许动态指定列标题名称。 有没有办法实现这个目标?

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;