2014-03-03 14 views
0

我有以下兩個表如何旋轉兩個表中的一個?

username   data_usage   cost 
    -----    ------   ---- 
user1    50   159 
user2    250  376 
user3    150  225 


    username  user1  user2  user3 
    -----  -----  -----  ----- 
data_usage   50  200  150 
cost  159  376  225 

,我要檢查,如果值是等於在兩個表,但問題是, 在第一個表中的用戶名是列名,其在第二值表

那麼無論如何反正在oracle中使用PL/SQL旋轉這個表? 或其他方式來做到這一點?

的輸出將是這樣

user1 has different values column name data usage 250 at first table and 200 at table2 

回答

2

使用樞軸和逆透視如果數據庫版本是> =甲骨文11.2

WITH table1(username,data_usage,cost) AS (
SELECT 'user1', 50, 159 FROM dual UNION ALL 
SELECT 'user2', 250, 376 FROM dual UNION ALL 
SELECT 'user3', 150, 225 FROM dual), 
table2(username,user1,user2,user3) AS (
SELECT 'data_usage', 50, 200, 150 FROM dual UNION ALL 
SELECT 'cost', 159, 376, 225 FROM dual) 
--- 
--End of data preparation 
--- 
select tb.username || ' has different values column name data usage '|| tb.data_usage ||' at first table and '|| ta.data_usage ||' at table2' as text 
from (select * 
     from table2 
    unpivot (val for users in (user1 as 'user1', user2 as 'user2', user3 as 'user3')) 
     pivot (min(val) for username in ('data_usage' as data_usage, 'cost' as cost))) ta 
join table1 tb on (username = users) 
WHERE ta.data_usage <> tb.data_usage; 

輸出繼電器:

|                     TEXT | 
|----------------------------------------------------------------------------------------| 
| user2 has different values column name data usage 250 at first table and 200 at table2 | 

只要使用這個查詢

select tb.username || ' has different values column name data usage '|| tb.data_usage ||' at first table and '|| ta.data_usage ||' at table2' as text 
from (select * 
     from table2 
    unpivot (val for users in (user1 as 'user1', user2 as 'user2', user3 as 'user3')) 
     pivot (min(val) for username in ('data_usage' as data_usage, 'cost' as cost))) ta 
join table1 tb on (username = users) 
WHERE ta.data_usage <> tb.data_usage; 

替換Table 1和Table與你的表名

+0

如果我必須寫爲每個記錄多數民衆贊成在選擇statment也沒用怎麼我有大約100萬的記錄那只是一個例子,因爲我想要的東西 – sam

+0

不考慮作爲查詢的一部分,將'數據準備結束'上面的部分完成,以避免在我的結尾創建物理表。僅使用後面的部分(即在「數據準備結束」之後)並將表1和表2替換爲表名。 – San

+0

http://sqlfiddle.com/#!4/623b6 – sam