2015-01-12 40 views
3

我是oracle新手。 我有一個表的同一行中的兩個值。我需要將行中的一個值轉置爲列標題,另一個值作爲該列標題的列值。 下面給出的Suspend表中的值的示例。在oracle中將行轉換爲列標題

 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 

掛起表中的項目不固定。 樞軸功能允許執行某些集合操作以進行轉置。 解碼(如在網上檢查)不允許動態指定列標題名稱。 有什麼辦法可以做到這一點?

回答

-1

你既可以使用帶有某些聚合功能的PIVOT,也可以使用一些報告工具,沒有其他方法可以實現你想要的結果。

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')) 
+0

這個東西是列名,即。,trade_id,Start_date或Trade_version是動態的。所以它只是trade_id或另一個新的名字可能在表中。因爲這可能會根據需求而改變。所以我不能直接使用名稱 –

+0

@ArchieDave - 對不起,在Oracle語法不好。檢查這個答案http://stackoverflow.com/questions/16978047/dynamic-oracle-pivot-in-clause轉換爲動態數據透視 –

0

這是SQL的東西不能做。使用SQL,您總是選擇之前已知的列。

但是,數據庫和SQL只是存儲和檢索數據的手段。你直接使用它們作爲程序員,但是對於一個用戶,你需要編寫一個程序(使用Java,C#,PHP或其他)來獲取並顯示數據。編寫這個程序,使其顯示結果,如你想要顯示。

換句話說:關心如何最精美地顯示數據不是dbms的任務。

另一點:這是一個非常通用的數據結構,應該有一個很好的理由來使用這樣的。在你的情況下:是否還有沒有ID的交易條目?有沒有像'1914年12月的某個時候','昨天','2000年10月1日或2日'的開始日期?或者你想將它們存儲爲字符串的原因是什麼?你會認識到'Trade_ID','Trade_Id'和'Trade ID'是一樣的嗎?話雖如此,但通過這樣的結構,您可以讓dbms無法幫助您,從提供數據類型完整性和數據一致性以及快速訪問數據。

如果由於某些嚴重的原因需要這樣一個多功能的結構,也許NoSQL DBMS會更合適。

-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; 
+0

什麼是錯的,這不是你的預期? –

+0

請提供降級原因 –

+0

我沒有降低這個數字,但你會如何提出這個解決方案,讓50行被轉換爲列?寫50'UNIONS'? – Annjawn

0

在Oracle中有一個用於動態透視的選項。 PIVOT XML。一旦獲得了XML,就可以使用XMLTABLE函數將其轉換爲關係表。